其他分享
首页 > 其他分享> > comet OJ 01背包

comet OJ 01背包

作者:互联网

01 背包
已经提交 尚未通过 时间限制:1000ms 内存限制:256MB 33.33%
提交人数:3

通过人数:1

题目描述

杨总有 mm 元,他来到了一个商场。这个商场共有 nn 种物品,每种物品用价格 a_ia
i

和价值 b_ib
i

来描述,且每种物品最多只能买一个。

这个商场每天都会有一个物品矩形“特别活动”,举行“特别活动”的物品的价值和价格都会在这一天变成新的数字。

现在告诉你特别活动的具体内容,请你帮杨总算一算,他今天最多能买的物品的价值之和最多为多少。

输入描述

输入第一行包含三个正整数n,m,tn,m,t,代表商店物品的数量,杨总带的钱,和询问的次数。( 1 \leq n,m \leq 2000, 1 \leq t \leq 3000 )(1≤n,m≤2000,1≤t≤3000)
接下来 nn 行,每行输入两个正整数,分别代表第 ii 个物品在平常的价格 a_ia
i

和价值 b_ib
i

。 ( 1 \leq a_i \leq m, 1 \leq b_i \leq 10^9 )(1≤a
i

≤m,1≤b
i

≤10
9
)
接下来有 tt 组询问,每组询问包含三个数字: x,c,dx,c,d 。代表某一天第 xx 个物品参与“特别活动”,并且价格变为 cc,价值变为 dd。(1 \leq c \leq m,1 \leq d \leq 10^9, 1 \leq x \leq n)(1≤c≤m,1≤d≤10
9
,1≤x≤n)

输出描述

对于每组询问,回答杨总那一天可以购买的物品最大价值和。

样例输入 1

3 10 3
1 2
5 10
4 9
1 3 8
2 3 5
3 4 5
样例输出 1

19
16
17
样例解释 1

注:每天(即每组询问)只有一个物品举行特别活动,其他物品的价格和价值均和平常时间相同。

第一天时,三个物品的价格和价值分别变为

3 8

5 10

4 9

显然买第2,3个物品获得的收益最高,为19。

第二天时三个物品的价格和价值变为

1 2

3 5

4 9

显然全部购买获得的收益最高,收益为16。


#include <iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int nmax=3005;
 
int v[nmax];
int w[nmax];
int dp[nmax];
int n,m,count;
 int Max(int a,int b)
 {
	 return a>b?a:b;
 }
int main(int argc, char** argv) {
	
cin>>n>>m>>count;
int i;
	for(i=0;i<n;i++){
			cin>>w[i]>>v[i];
		}
		while(count--)
		{
			int day,a,b;
		memset(dp,0,sizeof(dp));
			cin>>day>>a>>b;
			int temp1,temp2;
			temp1=w[day-1];
			temp2=v[day-1];
        w[day-1]=a;
		v[day-1]=b;
	i=0;
		int j;
		for(i=0;i<n;i++){
			for(j=m;j>=0;j--){
			  if(j>=w[i]){
			  	dp[j]=Max(dp[j],(dp[j-w[i]]+v[i]));
			  }
			   
			} 
		}
		cout<<dp[m]<<endl;
		w[day-1]=temp1;
		v[day-1]=temp2;
		}
	return 0;
}

标签:10,01,OJ,int,leq,物品,comet,day,dp
来源: https://blog.51cto.com/u_14013325/2903996