hdu2546:http://acm.hdu.edu.cn/showproblem.php?pid=2546
题意:给你N元,每一件食品可以购买一次,如果卡上多余5元即使透支也可以刷卡。少于5元不能使用,求最多能让卡的余额为多少?
题解:01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #define N 1003 7 using namespace std; 8 int v[N],dp[N],n,k; 9 int main(void){ 10 while (~scanf("%d",&n)&&n){ 11 memset(dp,0,sizeof(dp)); 12 for (int i=0;i<n;i++) 13 scanf("%d",&v[i]); 14 sort(v,v+n);//排序找出最贵的菜 15 scanf("%d",&k); 16 if(k<5){printf("%d ",k);continue;} 17 else{ 18 k-=5; 19 for (int i=0;i<n-1;i++)//转化成0-1背包 20 for (int j=k;j>=v[i];j--) 21 if (dp[j-v[i]]+v[i]> dp[j]) 22 dp[j]=dp[j-v[i]]+v[i]; 23 printf("%d ",k+5-dp[k]-v[n-1]); 24 25 } 26 } 27 return 0; 28 }