典型的01背包,动态规划问题
虽然AC了,但是还有有点不明白,为什么要加不选择物体的for循环(初步的想法是,有可能条件不满足调价物体,但是不应该是0,最少应该是【i-1】【j】的值)
参考:
http://qkxue.net/info/130583/OpenJudge-2-6-1775
http://www.hawstein.com/posts/dp-knapsack.html
#include "iostream"
using namespace std;
int result[101][1001];//maxP[i][j]表示前i个物体装到剩余体积为j的背包里能达到的最大价值
int main()
{
int T,M;//总时间上限,草药个数
cin>>T>>M;
for(int i=1;i<=M;i++)
{
int perT,perP;//某种草药采摘岁需要的时间和价值
cin>>perT>>perP;
for(int j=0;j<=T;j++)//不选择物体
{
result[i][j] = result[i-1][j];
}
for(int j=0;j<=T;j++)//选择物体
{
if(j+perT<=T)
result[i][j+perT] = max(result[i-1][j+perT],result[i-1][j]+perP);
//举例子:宝石
//从d(2, 7)到d(3, 10)就隔了1个宝石。 它有两种情况,装或者不装入背包。
// 如果装入,在面对前2个宝石时, 背包就只剩下体积7来装它们,而相应的要加上2号宝石的价值12, d(3, 10)=d(2, 10-3)+12=d(2, 7)+12;
// 如果不装入,体积仍为10,价值自然不变了, d(3, 10)=d(2, 10)。记住,d(3, 10)表示的是前3个宝石装入到剩余体积为10 的背包里能达到的最大价值,
// 既然是最大价值,就有d(3, 10)=max{ d(2, 10), d(2, 7)+12 }。
}
}
cout<<result[M][T]<<endl;
return 0;
}