题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[1005],dp[1005];
int main()
{
int n,m;
cin >> n;
for(int i = 0;i < n;i++) cin >> a[i];
cin >> 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]);
cout << m - dp[m - 5] - a[n - 1] << endl;
return 0;
}
这道题和0 - 1背包问题有点类似,此外还需要用到贪心的策略。要使自己卡上的钱最少,那就应该最后剩5元的情况下去买最贵的一个菜。所以我们先要对所有菜从小到大排序,然后留下5元准备去买最贵的菜,然后算出dp[m - 5] (dp[i]代表i元能买到菜的价格),最后答案就是所有的钱 - dp[m - 5] - 最贵的那道菜。