hdu2546饭卡

来源:互联网 发布:白狐小说网站源码 编辑:程序博客网 时间:2024/05/22 03:20

中文题目,题意就不说了,都能看懂。

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

代码如下:

#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;}


 

0 0
原创粉丝点击