1 题目
acwing 2.01背包问题
1.1 题目描述:
2 思路
01背包得名于背包中的同样物品只能放与不放,即放1个或0个,可使用动态规划来处理。
3 代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int n,m;
int v[N],w[N];
int f[N][N];
-----------------------------------------------------------------------------------------
int main()
{
-----------------------------------------------------------------------------------------
cin>> n >> m ;
for(int i =1;i<=n;i++) cin>>v[i]>>w[i];
-----------------------------------------------------------------------------------------
//i为放的物品,j为背包空间
//v[i]为占用空间,w[i]为当前价值
for(int i =1;i<=n;i++)
for(int j =1;j<=m;j++)
{
//两种状态,放物品i和不放物品i
//不放物品i,此时最大价值即为f[i-1][j] i-1就是不放i后的除i外的价值
f[i][j] = f[i-1][j];
//放物品i,首先要使得,j>=v[i]才能放得下i,
//然后f[i][j]即为不放物品i和放物品i两个选择的最大值
//注意不放物品i时,j-v[i]为不放i剩余的空间,再加上i的价值
if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
-----------------------------------------------------------------------------------------
cout<<f[n][m]<<endl;
return 0;
}