P1616 疯狂的采药 题解

发布时间 2023-07-22 19:18:16作者: 扶桃o

思路

这道题和 [NOIP2005 普及组] 采药的思路差不多
不同的是,这道题是完全背包,采药则是01背包。
转移方程为:dp[j]=max(dp[j],dp[j-w[i]]+v[i]);//滚动数组优化

代码

#include<bits/stdc++.h>
#define ll long long
#define ld long double
const int maxn=1e7+10;
using namespace std;
inline void read(int &x) {
	x=0;
	short flag=1;
	char c = getchar();
	while(c<'0'||c>'9') {
		if(c=='-')flag=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x << 3)+ (x << 1)+(c ^ 48);
		c=getchar();
	}
	x*=flag;
}
inline void write(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
long long t,m,w[maxn],v[maxn],dp[maxn]; 
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	cin>>t>>m;
	for(int i=1;i<=m;i++){
		cin>>w[i]>>v[i];
	}
	for(int i=1;i<=m;i++){
		for(int j=w[i];j<=t;j++){
			dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<<dp[t];
	return 0;
}