题目大意:
有一些不同种类的草药,采每一种都需要一些代价,每一种也有一定的价值,可无限采。在一段时间里,使可以采到的草药的总价值最大。
输入样例:
70 3
71 100
69 1
1 2
输出样例:
140
最精彩的来了!
思路详解:
说句实话,这道题挺简单的,原题更不用说,(原题传送门),一个01背包搞定,不过这里要注意一点:1. 每种草药可以无限制地疯狂采摘。也就是说,是个完全背包,也一般般啦(Devc++:那你还评测了n多遍)!言归正传,先来看看完全背包的状态转移方程与核心代码
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]);
}
}
那以上就是代码的核心部分,接下来贴完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e7+5;
long t,m,w[N],v[N],dp[M];//定义,不用说
int main()
{
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]<<endl;
return 0;//功德圆满
}