HDU-3449-Consumer(有依賴揹包)

Consumer




Problem Description

FJ is going to do some shopping, and before that, he needs some boxes to carry the different kinds of stuff he is going to buy. Each box is assigned to carry some specific kinds of stuff (that is to say, if he is going to buy one of these stuff, he has to buy the box beforehand). Each kind of stuff has its own value. Now FJ only has an amount of W dollars for shopping, he intends to get the highest value with the money.
 

Input

The first line will contain two integers, n (the number of boxes 1 <= n <= 50), w (the amount of money FJ has, 1 <= w <= 100000) Then n lines follow. Each line contains the following number pi (the price of the ith box 1<=pi<=1000), mi (1<=mi<=10 the number goods ith box can carry), and mi pairs of numbers, the price cj (1<=cj<=100), the value vj(1<=vj<=1000000)
 

Output

For each test case, output the maximum value FJ can get
 

Sample Input

3 800
300 2 30 50 25 80
600 1 50 130
400 3 40 70 30 40 35 60

Sample Output

210
 

題目意思:N個箱子,每個箱子需要花費Ai的代價

箱子裏面有K個物品,K個物品你可以選擇買任意個,但每個物品只能買一個,每個物品有相應的花費和價值

你又M的大洋,最後問最多能得到多少價值物品。

解題思路:先對每組選擇裏的所有物品進行0-1揹包處理,但揹包容量爲(總容量-盒子容量);然後跟上一組的狀態比較來決定這一組選擇是選還是不選,取其中的較大值。

#include<bits/stdc++.h>
using namespace std;
int dp[100005];
int tmp[100005];
int main()
{
    int n,w,p,m,c,v;
    while(~scanf("%d%d",&n,&w))
    {
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
        {
            memcpy(tmp,dp,sizeof(dp));///繼承前面的
            scanf("%d%d",&p,&m);
            for(int j=0;j<m;j++)
            {
                scanf("%d%d",&c,&v);
                for(int k=w-p;k>=c;k--)
                {
                    tmp[k]=max(tmp[k],tmp[k-c]+v);
                }
            }
            for(int k=p;k<=w;k++)
            {
                dp[k]=max(dp[k],tmp[k-p]);
            }
        }
        printf("%d\n",dp[w]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章