1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
-45 32
考点:0-1背包
题目分析:想要使卡上的余额最少,等价于消费最多。题中说每种菜只可购买一次,可见这题类似0-1背包,只不过多了一个条件,m<5,时不可购买任何菜。那么我们对菜价从小到大进行排序,拿出拿出m-5的钱去购买前n-1的菜,使得消费最大,剩下5元买最贵的n菜。这样就是消费最大的方案。
AC代码如下:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[1010]; int f[1010]; int main() { int n,m; while(scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); if(m<5) { printf("%d\n",m); continue; } sort(a+1,a+n+1);//从小到大排序 for(int i=1;i<=n-1;i++) for(int j=m-5;j>=a[i];j--) { f[j]=max(f[j],f[j-a[i]]+a[i]);//0-1背包模板 } printf("%d\n",m-f[m-5]-a[n]);//输出结果 } return 0; }