背包问题QWQ
交作业是不可能交作业的
01 背包问题-状态转移方程
using namespace std;
const int MAXN = 1005;
int w[MAXN]; // 重量
int v[MAXN]; // 价值
int f[MAXN][MAXN]; // f[i][j], j重量下前i个物品的最大价值
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> w[i] >> v[i];//input
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(w[i]>j)f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
cout<<f[n][m];
}
**//参考**
//作者:深蓝
// 链接:https://www.acwing.com/solution/content/1374/
//来源:AcWing
**理解**
* 核心思想是依次放入,空间依次增大;
* 核心操作是是否能放入,不能则同上,能则比较放入(可能会取出之前的物品)大还是不放入大;
**完全背包**
代码1:
#include<iostream>
using namespace std;
const int N = 1050;
int f[N][N];
int v[N],w[N];//v价值||w大小
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1 ; i <= n ;i ++)
cin>>w[i]>>v[i];//input
for(int i = 1 ; i<=n ;i++)
for(int j = 0 ; j<=m ;j++)
for(int k = 0 ; k*w[i]<=j ; k++)//多次放入
f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);
cout<<f[n][m];
}
//代码2
#include<iostream>
using namespace std;
const int N = 1050;
int f[N][N];
int v[N],w[N];//v价值||w大小
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1 ; i <= n ;i ++)
cin>>w[i]>>v[i];//input
for(int i = 1 ; i<=n ;i++)
for(int j = 0 ; j<=m ;j++)
{
f[i][j] = f[i-1][j];//保留
if(j-w[i]>=0)
f[i][j]=max(f[i-1][j],f[i][j-w[i]]+v[i]);
}
cout<<f[n][m];//output
}
代码3
***#include<iostream>
using namespace std;
const int N = 1050;
int f[N];
int v[N],w[N];//v价值||w大小
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1 ; i <= n ;i ++)
cin>>w[i]>>v[i];//input
for(int i = 1 ; i<=n ;i++)
for(int j =w[i] ; j<=m ;j++)
f[j] = max(f[j],f[j-w[i]]+v[i]);
//优化;一上来必选f[j],之后比较放上一个和放这个谁为最优解;
cout<<f[m];//output
}***
//参考
//作者:Tell_me
// 链接:https://www.acwing.com/solution/content/5345/
//来源:AcWing
~~芜湖,学习效率底下QWQ~~
我啥也没说,嘿嘿。(这个句号用的好!)