HDOJ 题目3449 Consumer(背包)

Consumer

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others)

Total Submission(s): 1435    Accepted Submission(s): 752

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

Source

2010 ACM-ICPC Multi-University
Training Contest(2)——Host by BUPT

Recommend

We have carefully selected several similar problems for you:  3535 2415 3443 3450 3448

每组物品加入了箱子的限制,如果要买改组物品,就必须先买箱子

考虑第i组物品时,前i-1组的最优值已经知道,假设总容量为V,改组的箱子的代价为p,那么如果我们要买该组物品,可用容量就只有V-p,所以,我们先用tmp数组记录前i-1阶段容量范围在[0,V-p]这个范围内的最优值,对应加上箱子的代价p的[p,V]这个区间,然后在这个范围内对改组物品做01背包,再去更新dp值

ac代码

#include<stdio.h>
#include<string.h>
#define max(a,b) (a>b?a:b)
__int64 dp[100010],n,m,temp[100010];
int main()
{
	while(scanf("%I64d%I64d",&n,&m)!=EOF)
	{
		int i,j,k,vv,cnt;
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&vv,&cnt);
			for(j=0;j+vv<=m;j++)
			{
				temp[j+vv]=dp[j];
			}
			for(j=1;j<=cnt;j++)
			{
				int w,v;
				scanf("%d%d",&w,&v);
				for(k=m;k>=w+vv;k--)
					temp[k]=max(temp[k],temp[k-w]+v);
			}
			for(j=vv;j<=m;j++)
				dp[j]=max(dp[j],temp[j]);
		}
		printf("%I64d\n",dp[m]);
	}
}
时间: 2024-08-27 21:18:54

HDOJ 题目3449 Consumer(背包)的相关文章

HDOJ 题目分类

HDOJ 题目分类 /* * 一:简单题 */ 1000:    入门用:1001:    用高斯求和公式要防溢出1004:1012:1013:    对9取余好了1017:1021:1027:    用STL中的next_permutation()1029:1032:1037:1039:1040:1056:1064:1065:1076:    闰年 1084:1085:1089,1090,1091,1092,1093,1094, 1095, 1096:全是A+B1108:1157:1196:1

HDOJ 题目3966 Aragorn&#39;s Story(Link Cut Tree成段加减点权,查询点权)

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5505    Accepted Submission(s): 1441 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

HDOJ 题目4738 Caocao&#39;s Bridges(双联通,求桥)

Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1752    Accepted Submission(s): 642 Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. B

HDOJ题目3729 I&#39;m Telling the Truth(二分图)

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1629    Accepted Submission(s): 805 Problem Description After this year's college-entrance exam, the teacher did a survey i

HDOJ 题目4349 Xiao Ming&#39;s Hope(找规律)

Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1515    Accepted Submission(s): 1015 Problem Description Xiao Ming likes counting numbers very much, especially he is fond of co

hdu 3449 Consumer (依赖01背包)

题目: 链接:点击打开链接 题意: 思路: dp[i][j]表示前i个箱子装j钱的材料可以得到的最大价值. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 100010 int dp[55][MAXN]; int main() { //freopen("input.txt","r",stdin);

HDOJ 题目2670 Girl Love Value(01背包)

Girl Love Value Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 748    Accepted Submission(s): 417 Problem Description Love in college is a happy thing but always have so many pity boys or girl

hdu 3449(依赖背包) Consumer

题意: 给n个箱子,每个箱子有个费用pi,每个箱子里面有m个物品,每个物品有两个属性,一个费用wi和一个价值vi.买物品的时候要把所属的箱子一起买了,问给一个金额W最多能获得多少价值? 思路 依赖背包.<背包九讲>的第七讲讲了这个. 设dp[i][j]为前i个箱子使用金额j获得的最大价值. 考虑每个箱子内部就是一个01背包,那么在枚举每一个箱子的时候,使用上一轮能满足本轮箱子费用的状态做一个01背包,然后本轮结束后更新dp数组. 最后的ans就是dp[n][W] 需要深刻理解一下这个依赖关系.

HDOJ 题目3033 I love sneakers!(分组背包)

I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4253    Accepted Submission(s): 1735 Problem Description After months of hard working, Iserlohn finally wins awesome amount of s