http://acm.hdu.edu.cn/showproblem.php?pid=2546
经典的01背包
预留5元买最贵的,剩余的就是01背包。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int main() { int pr[1005],bao[1005],i,j,n,m,ma; while(~scanf("%d",&n),n) { memset(bao,0,sizeof(bao)); for(i=1;i<=n;i++) scanf("%d",&pr[i]); sort(pr+1,pr+1+n); scanf("%d",&m); if(m<5) { printf("%d\n",m); continue; } m-=5; for(i=1;i<n;i++) { for(j=m;j>=pr[i];j--) { bao[j]=max(bao[j],bao[j-pr[i]]+pr[i]); } } printf("%d\n",m+5-bao[m]-pr[n]); } return 0; }
原文:http://www.cnblogs.com/benTuTuT/p/6422210.html