ZCMU-1368-背包

来源:互联网 发布:oracle数据库安装教程 编辑:程序博客网 时间:2024/06/05 20:29

1368: Dynamic Programming

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 70  Solved: 23
[Submit][Status][Web Board]

Description

有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。

Input

多组测试数据
每组第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)
第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)

Output

输出可以容纳的最大价值。

Sample Input

3 6
2 2 5
3 3 8
1 4 1

Sample Output

9



【解析】
背包问题,其实就是把各个背包的数量加上去放在数组当中就可以了,和背包问题是一样的。。注意状态转移方程
beibao[v]=beibao[v-ti[i]]+c[i];以及容量从v开始减少
#include<iostream>#include<string>#include<cstdio>#include<cstring>using namespace std;int main(){    int n,m,k,i,j,a,b,c,p,sum,v,q;    int ti[30000];    int we[30000];    int beibao[50000];    while(~scanf("%d%d",&n,&m))    {        p=1;        sum=0;        q=0;        v=0;        memset(ti,0,sizeof(ti));        memset(we,0,sizeof(we));        memset(beibao,0,sizeof(beibao));        for(i=0;i<n;i++)        {          scanf("%d%d%d",&a,&b,&c);           sum+=c;           q=c;           c=p+c;           for(j=p;j<c;j++)           {             ti[j]=a;             we[j]=b;           }           p=p+q;        }      for(i=1;i<=sum;i++)//物品的总数量      {          for(v=m;v>=ti[i];v--)//ti代表体积          {              if(beibao[v]<beibao[v-ti[i]]+we[i])                beibao[v]=beibao[v-ti[i]]+we[i];          }      }      printf("%d\n",beibao[m]);    }    return 0;}

0 0
原创粉丝点击