hdu 3449 Consumer (依赖01背包)

来源:互联网 发布:怎么看端口是否开放 编辑:程序博客网 时间:2024/05/21 14:51

题目:

        链接:点击打开链接

题意:

思路:

        dp[i][j]表示前i个箱子装j钱的材料能够得到的最大价值。

代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAXN 100010int dp[55][MAXN];int main(){    //freopen("input.txt","r",stdin);    int n,v;    int pi,mi;    int c,w;    while(scanf("%d%d",&n,&v) != EOF)    {        memset(dp,0,sizeof(dp));        for(int i=1; i<=n; i++)        {            scanf("%d%d",&pi,&mi);            for(int j=0; j<=pi; j++)                dp[i][j] = -1;            for(int j=v; j>=pi; j--)//依赖                dp[i][j] = dp[i-1][j-pi];            for(int j=0; j<mi; j++)//01背包            {                scanf("%d%d",&c,&w);                for(int k=v; k>=c; k--)                {                    if(dp[i][k-c] != -1)                        dp[i][k] = max(dp[i][k],dp[i][k-c]+w);                }            }            for(int j=v; j>=0; j--)//...........                dp[i][j] = max(dp[i][j],dp[i-1][j]);        }        printf("%d\n",dp[n][v]);    }    return 0;}


0 0
原创粉丝点击