HDU 4501

来源:互联网 发布:表情制作软件 编辑:程序博客网 时间:2024/05/18 13:09

超市里有n件他想要的商品。小明顺便对这n件商品打了分,表示商品的实际价值。小明发现身上带了v1的人民币,会员卡里面有v2的积分,而且他能免费拿k件。他想知道他最多能买多大价值的商品。
由于小明想要的商品实在太多了,他算了半天头都疼了也没算出来,所以请你这位聪明的程序员来帮帮他吧。


Sample Input
5 1 6 14 3 30 3 22 3 33 3 21 0 24 2 5 00 1 04 4 13 3 43 4 4
 

Sample Output
124

思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......

习惯性的在for中取最小值限制,因为这里导致wa了- -!,大概是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,我们可以让它不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值


#include <stdio.h>#include <malloc.h>#include <string.h>#include <stdlib.h>#include <iostream>using namespace std;struct node{    int x1,x2,x3;} per[105];int dp[105][105][110];int main(){    int n,v1,v2,k;    while(~scanf("%d%d%d%d",&n,&v1,&v2,&k))    {        for(int i = 1; i <= n; i++)            scanf("%d%d%d",&per[i].x1,&per[i].x2,&per[i].x3);        memset(dp,0,sizeof(dp));        for(int i= 1; i <= n; i++)            for(int j = v1; j >= 0; j--)                for(int l = v2; l >= 0; l--)                    for(int q = k; q >= 0; q--)                    {                        int maxn= 0;                        if(j >= per[i].x1 && maxn<dp[j-per[i].x1][l][q]+per[i].x3 )                            maxn = dp[j-per[i].x1][l][q]+per[i].x3;                        if(l >= per[i].x2 &&maxn< dp[j][l-per[i].x2][q]+per[i].x3)                            maxn = dp[j][l-per[i].x2][q]+per[i].x3;                        if(q> 0 && maxn < dp[j][l][q-1]+per[i].x3)                            maxn = dp[j][l][q-1]+per[i].x3;                        if(maxn > dp[j][l][q])                            dp[j][l][q] = maxn;                    }        printf("%d\n",dp[v1][v2][k]);    }    return 0;}




0 0
原创粉丝点击