一、问题描述
有n个物品,他们有各自的价值与重量,现给定容量的背包,使得背包装入最大价值总和?
二、总体思路
根据动态规划找出01背包问题的最优解以及解组成,然后编写代码实现;
三、过程
第一、包的容量比该商品体积小,装不下,此时的价值与钱i-1的价值是一样的,即v(i,j)=v(i-1,j);
第二、有足够容量装该商品,但装也不一定达到当前最优价值,所以在装与不装之间选一个最大值
v(i,j)=max(v(i-1,j),v(i-1,j-w(i))+v(i));
由此可得当:
j<w(i) v(i,j)=v(i-1,j)
j>=w(i) v(i,j)=max(v(i-1,j),v(i-1,j-w(i))+v(i))
初始化边界,v(0,j)=(i,0)=0;
代码详情:
void Findmax(){
for(int i=1;i<=number;i++){
for(int j=1;j<=capacity;j++){
if(j<w[i])
v[i][j]=v[i-1][j];
else
v[i][j] = max(v[i-1][j],v[i-1][j-w[i]]+v[i]);
}
}
}
测试案列:
number:4,capacity= 8;
input:
4,8
w : 2 , 3 , 4 , 5
v : 3 , 4 , 5 , 6
output:
10
代码实现:
#include <iostream>
using namespace std;
#include<cmath>
#define MAXN 120
int w[MAXN];
int v[MAXN];
int V[MAXN][MAXN];
int main() {
int n,M;
cin>>n>>M;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=M;j++){
V[0][j] = V[i][0] = 0;
if(j<w[i])
V[i][j] = V[i-1][j];
else
V[i][j] = max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
}
}
cout<<V[n][M]<<endl;
return 0;
}