1. 简单描述
01背包问题
总时间为n,总药材数为m。各种药材消耗时间t【i】,价值v【i】,求在规定时间内,能采到的草药最大价值数。
2.思路
#include<bits/stdc++.h>
using namespace std;
struct Herb
{
int time;
int value;
}herb[1001];
int main()
{
int n,m;
int dp[1001];
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>herb[i].time;
cin>>herb[i].value;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
for(int j=n;j>=herb[i].time;j--)
{
dp[j]=max(dp[j],dp[j-herb[i].time]+herb[i].value);
}
}
cout<<dp[n]<<endl;
return 0;
}
1.划分子问题 前i件物品放入体积为v的背包的最大价值.
2.i、v两个变量决定了背包的最大价值,经过优化,可以表示为一维数组。求最优子问题转化为求前i件物品放入体积为v背包的最优决策问题。
3.寻找状态转移方程 第i件物品放入背包和不放入背包的状态转移方程
4.自底向上寻求最优解。