题解:P1048 [NOIP2005 普及组] 采药
思路:
参考了 OI Wiki。
背包 DP 模版题。
首先定义一个
考虑转移。
枚举每一个物品在背包容量剩余
如果现在枚举的剩余容量
否则有两种情况,选和不选。
对于选的情况,背包的剩余容量会减小这个物品需要的容量,价值会增加这个物品的价值,故此情况下的价值为
在此处再解释下
所以可以得出转移方程:
对于剩余容量大于等于选择这个物品需要的容量时
否则
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int m,n,t;
int dp[1050][1050];
int uset[105],price[105];
int main(){
cin>>t>>m;
for(int i=1;i<=m;i++)
cin>>uset[i]>>price[i];
for(int i=1;i<=m;i++)
for(int j=0;j<=t;j++){
if(j>=uset[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-uset[i]]+price[i]);
else
dp[i][j]=dp[i-1][j];
}
cout<<dp[m][t];
return 0;
}