`
lovnet
  • 浏览: 6710500 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

HDU 3033 I love sneakers!(分组背包变形)

 
阅读更多

题目链接:Click here~~

题意:

有n件物品被分成K组,背包容量为M,要求每组物品至少取1件,求最大价值。

解题思路:

由于至少取1件,所以我们要想办法标记合法状态。

初始设dp[0][i]为0,其余全部为-1,-1表示非法状态。

另外,要将原本分组背包中的两层循环调换下位置,否则只能将那组的一件物品放入背包。

trick:数据中有费用为0的物品,所以if不能交换位置,否则可能会将费用为0的物品放入背包两次。

写代码时候一个k写成了i,WA完找了1小时+,rbl。

#include <stdio.h>
#include <string.h>
#define max(a,b) a > b ? a : b
struct TT
{
    int num,c[101],w[101];
}A[11];
int dp[11][10005];
int main()
{
    int n,V,K,t;
    while(~scanf("%d%d%d",&n,&V,&K))
    {
        memset(A,0,sizeof(A));
        memset(dp,-1,sizeof(dp));
        memset(dp[0],0,sizeof(dp[0]));
        while(n--)
        {
            scanf("%d",&t);
            int &m = A[t].num;
            scanf("%d%d",&A[t].c[m],&A[t].w[m]);
            ++m;
        }
        for(int k=1;k<=K;k++)
            for(int i=0;i<A[k].num;i++)
                for(int j=V;j>=A[k].c[i];j--)
                {
                    if(dp[k][ j-A[k].c[i] ] != -1)
                        dp[k][j] = max(dp[k][j],dp[k][ j-A[k].c[i] ] + A[k].w[i]);
                    if(dp[k-1][ j-A[k].c[i] ] != -1)
                        dp[k][j] = max(dp[k][j],dp[k-1][ j-A[k].c[i] ] + A[k].w[i]);
                }
        if(dp[K][V] < 0)
            puts("Impossible");
        else
            printf("%d\n",dp[K][V]);
    }
    return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics