HDU 2546 饭卡——背包 + 贪心

来源:互联网 发布:经济学考研知乎 编辑:程序博客网 时间:2024/05/13 16:28

排序后把前n-1个物品放到容量为m-5的背包中,获得最大值dp【m-5】,这就是尽量用前n-1个物品填满容量m-5的背包的结果,然后用m-dp【m-5】-a【n】就得到了结果

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n, a[1010], m, dp[1010];int main(){    while (cin >> n && n) {        for (int i = 1; i <= n; i++) {            cin >> a[i];        }        cin >> m;        if (m < 5) {            cout << m << endl;        }        else {            sort(a + 1, a + 1 + n);            memset(dp, 0, sizeof(dp));            for (int i = 1; i <= n - 1; i++) {                for (int j = m - 5; j >= a[i]; j--) {                    dp[j] = max(dp[j], dp[j - a[i]] + a[i]);                }            }            cout << m - dp[m - 5] - a[n] << endl;        }    }    return 0;}