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