杭电-2546 饭卡(01背包)

来源:互联网 发布:错生网络剧百度云 编辑:程序博客网 时间:2024/06/04 20:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546

状态转移方程:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);

思路 : 小于5元时可以直接输出,大于5元的时候,先拿出5元买最贵的菜,然后求剩下的钱的最大支出。最后用余额减去这些支出就得出结果啦

代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;int dp[1100];int price[1100];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        if(n==0)            break;        for(int i=0;i<n;i++)            scanf("%d",&price[i]);        memset(dp,0,sizeof(dp));        int left;        scanf("%d",&left);        if(left<5)        {          printf("%d\n",left);          continue;        }        sort(price,price+n);        for(int i=0;i<n-1;i++)        {            for(int j=left-5;j>=price[i];j--)            {                dp[j]=max(dp[j],dp[j-price[i]]+price[i]);            }        }        printf("%d\n",left-dp[left-5]-price[n-1]);    }    return 0;}


0 0
原创粉丝点击