思路:
最贵的菜一定是最后一次购买使餐卡上剩下的钱最小。
输入如果小于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 }