题目
分析
余额>=5就可以买任何商品(购买后余额可以为负),余额<5则不能购买任何商品,即使余额足够支付.
目标是使卡上的余额最少
这实际上是一个变形的背包问题,背包的容量就是卡上的余额而我们的目标就是尽量装满背包.
可以将背包的容量视为m-5,且去掉菜谱里最贵的菜,这样就是纯粹的01背包问题
AC代码
#include "bits/stdc++.h"
using namespace std;
int a[1010], f[1010];
int main(int argc, char const *argv[])
{
int n, m, i, v;
while(cin >> n && n){
for(i = 0; i<n; i++)
cin >> a[i];
cin >> m;
int V = m - 5;
if(V<0){
cout << m << endl;
continue;
}
memset(f, 0, sizeof(f));
int ans = 0, ansi;
//找到并去掉最贵的菜
for(i = 0; i<n; i++){
if(a[i] > ans){
ans = a[i];
ansi=i;
}
}
a[ansi] = 0;
for(i=0;i<n;i++){
for(v=V;v>=a[i];v--){//01背包
f[v] = max(f[v], f[v-a[i]]+a[i]);
}
}
cout << m-f[V]-ans << endl;
}
return 0;
}