HDU 2546 饭卡(01背包)

思路:

最贵的菜一定是最后一次购买使餐卡上剩下的钱最小。

输入如果小于5的话直接输出~

不然先从所有菜中找出最贵的菜,然后给餐卡至少留下5块钱买这个最贵的菜,剩下的用一个0-1背包去装满!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define sc(x) scanf("%d",&(x))
 6 #define pf(x) printf("%d
", x)
 7 #define CL(x, y) memset(x, y, sizeof(x))
 8 #define max(a, b) (a > b ? a : b)
 9 using namespace std;
10 const int MAX = 1005;
11 int dp[MAX], money[MAX];
12 int n, m;
13 int main ()
14 {
15     int i, j;
16     while(sc(n))
17     {
18         if(n == 0) break;
19         CL(dp, 0);
20         for (i = 0; i < n; i++)
21             sc(money[i]);   //价格
22         sc(m);  //卡上的余额
23         sort(money, money+n);     //排序,求前n-1个钱价的最大钱数
24         if (m < 5)
25             pf(m);
26         else
27         {
28             for (i = 0; i < n-1; i++)    //01背包问题
29                 for (j = m-5; j >= money[i]; j--)
30                     dp[j] = max(dp[j], dp[j-money[i]] + money[i]);
31             pf(m - dp[m-5] - money[n-1]);   //money[n-1] 最后一个价格
32         }
33     }
34     return 0;
35 }
View Code
原文地址:https://www.cnblogs.com/ghostTao/p/4303562.html