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