HDU2546 01背包
2012-08-22 20:08
225 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
解题思路:要使得买饭后卡上的余额达到最小,但由于有限制条件就是卡上的必须剩下不小于5元才能买饭,这样的情况用01背包是肯定错误的得不到最优的解,我们知道要使得卡上余额最小那就是要让最贵的菜最后买,所以剩下来的n-1种菜就可以用01背包求解了
解题思路:要使得买饭后卡上的余额达到最小,但由于有限制条件就是卡上的必须剩下不小于5元才能买饭,这样的情况用01背包是肯定错误的得不到最优的解,我们知道要使得卡上余额最小那就是要让最贵的菜最后买,所以剩下来的n-1种菜就可以用01背包求解了
#include<iostream> using namespace std; #define max(a,b) a>b?a:b int w[1005]; int f[10005]; int ZeroOneBack(int w[],int n,int momey,int p) { for(int i=1;i<=n;i++) { if(i!=p) { for(int j=momey;j>=w[i];j--) { f[j]=max(f[j],f[j-w[i]]+w[i]); } } } return f[momey]; } int main() { int i,p,max; int m,n; while(cin>>n,n) { max=0; memset(f,0,sizeof(f)); for(i=1;i<=n;i++) cin>>w[i]; cin>>m; for(i=1;i<=n;i++) { if(w[i]>max) { p=i; max=w[i]; } } if(m<5) cout<<m<<endl; else { int s=ZeroOneBack(w,n,m-5,p); cout<<m-s-max<<endl; } } return 0; }
相关文章推荐
- hdu2546-01背包
- hdu2546 饭卡_特殊的01背包
- hdu2546 饭卡 01-背包问题
- HDU2546 01背包
- 01背包 hdu2546 hdu2602
- hdu2546 01背包
- hdu2546 饭卡(01背包水)
- hdu2546 01背包 重学背包
- hdu2546 饭卡(01背包 dp)
- ACM-01背包之饭卡——hdu2546
- hdu2546 01背包 重学背包
- hdu2546 饭卡 01-背包问题
- hdu2546(01背包变形)
- hdu2546 01背包
- 01背包、完全背包、多重背包模板
- 01背包问题回溯法和动态规划
- lightoj 1079 概率计算+01背包
- hdu 2660 Accepted Necklace(01-背包变形 || DFS)
- 背包——变向背包(hdu2546,1114,1203,2189)
- nyoj 又见01背包