坚持动态编程

stuck on dynamic programming

本文关键字:编程 动态 坚持      更新时间:2023-10-16

问题如下:奶工用不同尺寸的包装瓶供应牛奶。瓶子的可能尺寸为{1、5、7和10}升。无论大小,他都希望用尽可能少的瓶子来供应所需的数量。您的目标是帮助他找到满足特定牛奶需求所需的最低瓶子数量。

输入格式:

第一行包含测试用例数N接下来的N行,每行包含一个正整数Li,该整数对应于牛奶的需求。

输出格式:

对于每个输入Li,打印满足需求所需的最小瓶子数量

我已经为这个问题写了这个代码。

#include <iostream>
#include <vector>
#include <stdio.h>
#include <set>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <iomanip>
#include <locale>
#include <stdlib.h>
#include <cstring>
#include <cmath>
#include <tgmath.h>
using namespace std;
const int INF = 1000000000;
int m[4] = { 1, 5, 7, 10 };
int r[100000000];
int milk(int n) {
    int q;
    if (r[n] < INF)
        return r[n];
    if (n <= 0)
        q = 0;
    else {
        q = INF;
        for (int i = 0; i < 4; i++) {
            if (n >= m[i])
                q = min(q, 1 + milk(n - m[i]));
        }
    }
    r[n] = q;
    return q;
}
int main() {
    int t, n;
    cin >> t;
    while (t--) {
        cin >> n;
        memset(r, INF, sizeof(r));
        cout << milk(n) << endl;
    }
    return` 0;
}

我为此使用了动态编程。但我只得到每个输入的输出为零。我是dp的新手。请帮忙。

int milk(int n) {
    int min;
    memset(r, 0, sizeof(r));
    for (int i = 1; i <= n; i++) {
        min = 10000000; // some very large value greater than n
        for (j = 0; j <= 3; j++) {
            if (m[j] > i)
                continue;
            else if (r[i - m[j]] < min)
                min = r[i - m[j]];
        }
        r[i] = min;
    }
    return r[n];
}

我希望这能起作用,如果你有任何疑问,请发表评论。