01背包问题
题目描述
https://www.acwing.com/problem/content/2/
算法描述
f
[
i
]
[
j
]
f[i][j]
f[i][j]记录容量为
j
j
j是选择前
i
i
i件物品的最大价值。因为每个物品只有一个,所以只有选和不选两种选择。
最后输出
f
[
n
]
[
m
]
f[n][m]
f[n][m],即容量为
m
m
m时选择前
n
n
n件物品的最大值。
时间复杂度
O ( N ∗ M ) O(N*M) O(N∗M)
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int w[200],v[200],f[200][200];
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(j>=v[i]&&f[i][j]<f[i-1][j-v[i]]+w[i])
f[i][j]=f[i-1][j-v[i]]+w[i];
}
}
cout<<f[n][m];
}