您的位置:首页 > 其它

hdu2546饭卡

2016-05-21 16:53 183 查看
中文题目,题意就不说了,都能看懂。

转换一下就是一个背包问题。先把最大值去掉,用剩余的钱来买东西。可以把剩余的钱看作背包的体积,每一样饭菜看作每一个物品的体积,求背包里最多可以装多少东西就可以了。最后用背包剩余的体积减去最大值就行了。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,i,j;
int a[1100],dp[1100];
while(scanf("%d",&n),n!=0)
{
memset(dp,0,sizeof(dp));
for(i=0; i<n; i++)
scanf("%d",&a[i]);
scanf("%d",&m);
if(m<5)
{
printf("%d\n",m);
continue;
}
m=m-5;
qsort(a,n,sizeof(a[0]),cmp);
for(i=1; i<n; i++)
for(j=m; j>=a[i]; j--)
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
printf("%d\n",m+5-dp[m]-a[0]);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: