HDU - 2546 饭卡

来源:互联网 发布:三国战记电脑mac版 编辑:程序博客网 时间:2024/04/27 15:41

解题思路:01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了。

状态转移方程为:f[j]=max(f[j],f[j-price[i]]+price[i]) , f[j]表示买前i件物品,预算为j时的最大花销

为了好弄,我把最贵的移到数组尾部。

#include <cstdio>#include <algorithm>using namespace std;int main() {    int n, m;    while (scanf("%d", &n) && n) {        int A[1010], DP[1010] = {0};        for (int i = 0; i < n; i++)            scanf("%d", &A[i]);        scanf("%d", &m);        sort(A, A + n);        for (int i = 0; i < n-1; i++)            for (int j = m - 5; j >= A[i]; j--)                DP[j] = max(DP[j], DP[j-A[i]] + A[i]);        printf("%d\n", m < 5 ? m : m - DP[m-5] - A[n-1]);    }    return 0;}
0 0