Light oj 1200 - Thief(水)

本文介绍了一个关于背包问题的具体实例,该问题涉及一名小偷如何在满足特定条件的情况下最大化其收益。通过对物品的选择和数量的调整,在不超过背包容量限制的同时尽可能多地获取额外利润。

1200 - Thief
Time Limit: 3 second(s)Memory Limit: 32 MB

A thief has entered into a super shop at midnight. Poor thief came here because his wife has sent him to buy some necessary households. Instead of buying the items, he decided to steal them.

He has a bag with him which can carry up to W kg. In the list (given by his wife) there are four fields 1) item name, 2) the price of the item, 3) how many of this item is required and 4) the weight of this item. The items are solid items, so he can't take any item after dividing into pieces.

Now the thief wants to take items in his bag such that it fulfills his wife's list, and the total weight of the items is not greater than W. And he can't take any item other than the items mentioned in the list, otherwise his wife would found the item and he may get caught. But he can take more items than required. And he wants to sell these extra items and earn some money. Assume that he can take any item (is in the list) any number of times unless they overflow his bag.

Now you are given the necessary information of the items and his bag, you have to find the maximum profit the thief can make.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case starts with a line containing two integers n (1 ≤ n ≤ 100) and W (1 ≤ W ≤ 10000), where n denotes the number of items. Each of the next n lines contains three integers pi ci wi (1 ≤ pi, ci, wi ≤ 100), meaning that the price of the ith item is pici of it must be taken, and the weight is wi.

Output

For each case, print the case number and the maximum profit he can get. If it's impossible to fulfill his wife's requirements, print 'Impossible'.

Sample Input

Output for Sample Input

2

3 20

10 1 10

5 1 5

1 1 1

1 10

10 1 11

Case 1: 4

Case 2: Impossible

 


PROBLEM SETTER: JANE ALAM JAN

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>

#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define bug printf("hihi\n")

#define eps 1e-12

typedef long long ll;

using namespace std;
#define N 10005

int dp[N],n,all;

int price[N],cost[N];

int main()
{
    int i,j,t,ca=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&all);
        int temp=0;
        int x;
        for(i=0;i<n;i++)
        {
             scanf("%d%d%d",&price[i],&x,&cost[i]);
             temp+=x*cost[i];
        }
        if(temp>all)
        {
            printf("Case %d: Impossible\n",++ca);
            continue;
        }
        all-=temp;
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
            for(int v=cost[i];v<=all;v++)
                dp[v]=max(dp[v],dp[v-cost[i]]+price[i]);
        printf("Case %d: %d\n",++ca,dp[all]);
    }
    return 0;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值