题目大意:
一个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值,请你在规定时间内尽可能的把采草药,使采到的草药的价值最大。
思路:
这是很明显一道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;
}
本文介绍了一种典型的01背包问题解决方法,通过实例详细解释了如何利用动态规划算法求解最优解。针对特定场景——在限定时间内采集草药以获得最大价值,给出了清晰的状态转移方程,并附带完整代码实现。
305

被折叠的 条评论
为什么被折叠?



