01背包
问题引入
已知现在共有n种物品,每种物品有且只有一个,第i个物品重Wi,价值Vi,有一个背包最大容量为m,问怎么装使得价值最高为多少。n,m,各个物品的w,v如下。
3 5
2 3
3 5
4 7
解决思想
一个物品,取或者不取,就是两种情况。定义一个dp[i] [j]数组(价值),i表示从0~i的物品,j表示剩余容量。列表如下:
i\j 0 1 2 3 4 5
0 0 0 0 0 0 0
1 0 0 3 3 3 3
2 0 0 3 5 5 8
3 0 0 3 5 7 8
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
struct Stuff{
int w,v;
}stuff[5050];
ll dp[5050][5050];
int f(int i,int j)
{
if(i<1||j<1) return 0;
if(dp[i][j]==0)
{
if(j>=stuff[i].w)
dp[i][j]=max(f(i-1,j),f(i-1,j-stuff[i].w)+stuff[i].v);//不选或者选该物品
else
dp[i][j]=f(i-1,j);
}
return dp[i][j];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>stuff[i].w>>stuff[i].v;
// for(int i=0;i<=n;i++)
// {
// for(int j=0;j<=m;j++)
// {
// cout<<setw(2)<<f(i,j);
// }
cout<<f(n,m);
// }
return 0;
}
后面慢慢补充