问:给你N元,每一件食品可以购买一次,如果卡上多余5元即使透支也可以刷卡。少于5元不能使用,求最多能让卡的余额为多少?
思路:背包问题,用DP,具体细节看注释!
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 1000 + 10
int value[MAXN]; //value[i] 表示给你 i 元,你最多能花掉多少钱。
int menu[MAXN]; //记录菜单
void init() {
for (int i=0; i<MAXN; i++) {
value[i] = 0;
}
}
int main() {
int n;
while(cin>>n, n) {
init();
for (int i=0; i<n; i++) {
cin>>menu[i];
}
int money;
cin>>money;
if (money < 5) { //不足够5元直接输出
cout<<money<<endl;
continue;
}
sort(menu,menu + n);
int max = menu[n - 1];
for (int i=0; i<n-1; i++) {
for (int j=money; j>=menu[i]; j--) {
//对value数组进行更新。因为有j>=menu[i],所以不必担心买到的
//东西会超出钱额。
//value[j - menu[i]] + menu[i] 有点难理解。
//举个例子:商品3元,给你10元,已知10元最多能花掉N元,那么如果 (10 - 3) 元能最大花的钱 + 3元比N大,、
//那么理所当然应当替代他。
value[j] = (value[j - menu[i]] + menu[i]) > value[j] ? (value[j - menu[i]] + menu[i]) : value[j];
}
}
cout<<money - value[money - 5] - max<<endl;
}
}