HDU2546

来源:互联网 发布:软件系统可靠性需求 编辑:程序博客网 时间:2024/05/16 05:53

最贵的选择在最后买,当然,此时钱数要大于5元,背包容量就是v-5,物品就是i-1个,转移方程还是那个样子。
状态转移方程为:f[j]=max(f[j],f[j-price[i]]+price[i]) , f[j]表示买前i件物品,预算为j时的最大花销。
另外需要注意的是要考虑到一开始就少于5元的情况,就直接输出了,一开始没考虑到WA了好多次( # ▽ # )

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <algorithm>using namespace std;int main(){    int n;    int i,j,v;    int price[1010],dp[1010];    while(~scanf("%d",&n),n)    {        memset(price,0,sizeof(price));        for(i=1;i<=n;i++)        {            scanf("%d",&price[i]);        }        sort(price+1,price+n+1);        scanf("%d",&v);        if(v<5)        {            printf("%d\n",v);        }        else        {            memset(dp,0,sizeof(dp));            for(i=1;i<n;i++)            {                for(j=v-5;j>=price[i];j--)                    dp[j]=max(dp[j],dp[j-price[i]]+price[i]);            }            printf("%d\n",v-price[n]-dp[v-5]);        }    }    return 0;}
0 0
原创粉丝点击