*最简单的背包问题(背包问题变式——参考洛谷1616)
#include<bits/stdc++.h>
using namespace std;
int t,m;
int w[1010],v[1010];
int dp[1010];
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=t;j>=w[i];j--)//先从最多时间开始计算
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);//这个代码最核心的地方
}
cout<<dp[t];
return 0;
}
//参考菜鸡互啄12的背包问题有感
https://www.cnblogs.com/ypw1131115630/p/12988766.html
一、 问题描述
有n件物品,每件物品都只有一件,每件物品的重量为w[i],价值为v[i],现在有一个容量为V的背包,问如何选取物品放入背包,使得背包内的物品的总价值最大?
此时,我们举个例子:设一共有4件物品,背包的容量为8,每件物品的质量和价值分别为 2 3,3 4,4 5,5 6,求该背包最大能装的物品的价值是多少
4 8
2 3
3 4
4 5
5 6
//dp[]的初始值都是0
//dp[j]表示的是,当容量最多为j是,最大价值为多少
i=1;//意思是,当第一件物品可以装入包中,随着可装容量的减少,取得最大价值。
dp[8]=max(dp[8],dp[8-w[1]]+v[1])=dp[8-w[1]]+v[1]=dp[6]+v[1]=3;
dp[7]=max(dp[7],dp[7-w[1]]+v[1])=dp[7-w[1]]+v[1]=dp[5]+v[1]=3;
dp[6]=max(dp[6],dp[6-w[1]]+v[1])=3;//两者均为3
dp[5]=3;
dp[4]=3;
dp[3]=3;
dp[2]=3
dp[1]=0;
i=2;//当前两件物品可以装入包中,随着容量的减少,取得最大价值
//后面的依次类推 (代码请参考上述链接)
下图中的每行顺序是从dp【1】——dp【8】