HDU 3033 分组背包

来源:互联网 发布:淘宝的盈利模式 编辑:程序博客网 时间:2024/05/21 11:06

这是我第一道分组背包。。

刷STEP时遇到的

还算比较简单哈。。在01背包的基础上状态多加一维就好了

状态转移方程f[i][j] 表示选了i种品牌花费j获得的最大值

f[i][p]=max(f[i][p],f[i][p-a[j].cost]+a[j].value);//选当前品牌的物品
f[i][p]=max(f[i][p],f[i-1][p-a[j].cost]+a[j].value);//添加当前品牌

#include<stdio.h>#include<string.h>int f[20][10010];int n,m,k;struct item{   int brand;   int cost;   int value;}a[110];int max(int a,int b){    return a>b?a:b;}void pack() {     int i,j,p;     for(i=1;i<=k;i++)     {      for(j=1;j<=n;j++)      {        for(p=m;p>=a[j].cost;p--)        {              if(a[j].branf==i)            {             f[i][p]=max(f[i][p],f[i][p-a[j].cost]+a[j].value);//选当前品牌的物品              f[i][p]=max(f[i][p],f[i-1][p-a[j].cost]+a[j].value);//添加当前品牌             }        }      }     } }int main(){    while(scanf("%d%d%d",&n,&m,&k)==3)    {        memset(f,0,sizeof(f));        int i;        for(i=1;i<=n;i++)        {          scanf("%d%d%d",&a[i].brand,&a[i].cost,&a[i].value);        }        pack();        if(f[k][m]==0)        printf("Impossible\n");        else        printf("%d\n",f[k][m]);    }    return 0;}