http://acm.hdu.edu.cn/showproblem.php?pid=2546
1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
-45 32
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a<b; } int c[2020]; int dp[2020]; int main() { int n,i,j,m,maxs; while(~scanf("%d",&n),n) { memset(dp,0,sizeof(dp)); memset(c,0,sizeof(c)); for(i=1;i<=n;i++) scanf("%d",&c[i]); sort(c+1,c+1+n,cmp); maxs=c[n]; //最大的最后减,使余额最小。 scanf("%d",&m); if(m<5) { printf("%d\n",m); continue; } m-=5; //留5块买最贵的。 for(i=1;i<n;i++) { for(j=m;j>=c[i];j--) { dp[j]=max(dp[j],dp[j-c[i]]+c[i]); } } printf("%d\n",m+5-dp[m]-maxs); } return 0; }
杭电 2546 饭卡(01背包),布布扣,bubuko.com
原文:http://blog.csdn.net/u012766950/article/details/38434209