题目大意:
一个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值,请你在规定时间内尽可能的把采草药,使采到的草药的价值最大。
思路:
这是很明显一道01背包的问题,遇到一株草药我们可以选择采或者不采。如果w[i]表示第i株草药的价值,w[i]表示第i株采草药所需的时间,那么我们就得到了状态转移方程:
f[i][j]=max{f[i][j],f[i-1][j-w[i]]+c[i]}
简化后得:
f[j]=max{f[j],f[j-w[i]]+c[i]}
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int f[100001],w[100001],n,t,c[100001];
//w为采草药的时间,c为草药的价值
int main()
{
scanf("%d%d",&t,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]); //读入不解释
for (int i=1;i<=n;i++)
for (int j=t;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+c[i]); //状态转移方程
printf("%d",f[t]); //最终的答案为f[t]
return 0;
}