有n个物品,每个物品有两个属性:一个是体积 w i w_i wi,一个是价值 v 1 v_1 v1,可以表示为: ( w 1 , v 1 ) , ( w 1 , v 1 ) , … , ( w 1 , v n ) {(w_1,v_1 ),(w_1,v_1 ),…,(w_1,v_n )} (w1,v1),(w1,v1),…,(w1,vn)。同时我们还有一背包,背包的容量用W表示。现在我们将物品放入背包,放入的物品体积的总和不得超过背包的体积。
问:这个背包能装下的最大价值。
#include
#include
using namespace std;
#define Max_n 105
#define Max_W 10000
int n,W;
int w[Max_n],v[Max_n];
//goods_index:当前搜索到的物品下标
//residue_W:背包剩余容量
int DFS(int goods_index,int residue_W)
{
if(goods_index==n){
//已经没有物品
return 0;
}
if(residue_W<w[goods_index]){
//当前物品已经放不进去
return DFS(goods_index+1,residue_W);
}
if(residue_W>=w[goods_index]){
//当前物品可以放进去,有两种选择放或不放
return max(v[goods_index]+DFS(goods_index+1,residue_W-w[goods_index]),DFS(goods_index+1,residue_W));
}
}
#include
#include
using namespace std;
#define Max_n 105
#define Max_W 10000
int n,W;
int w[Max_n],v[Max_n];
//全局变量默认为0
int DP[Max_n][Max_W]; //记录状态的数组
memset(DP,-1,sizeof(DP));
//goods_index:当前搜索到的物品下标
//residue_W:背包剩余容量
int DFS(int goods_index,int residue_W)
{
if (DP[goods_index][residue_W]>=0){
return DP[goods_index][residue_W];
}
if(goods_index==n){
//已经没有物品
return DP[goods_index][residue_W]=0;
}
if(residue_W<w[goods_index]){
//当前物品已经放不进去
return DP[goods_index][residue_W]=DFS(goods_index+1,residue_W);
}
if(residue_W>=w[goods_index]){
//当前物品可以放进去,有两种选择放或不放
return DP[goods_index][residue_W]=max(v[goods_index]+DFS(goods_index+1,residue_W-w[goods_index]),
DFS(goods_index+1,residue_W));
}
}
#include
#include
using namespace std;
#define Max_n 105
#define Max_W 10000
int n,W;
int w[Max_n],v[Max_n];
//全局变量默认为0
int DP[Max_n][Max_W]; //记录状态的数组
void Dynamic_degradation(){
for(int i=n-1;i>=0;i--){
for(int j=0;j<=W;j++){
if(j<w[i])
DP[i][j]=DP[i+1][j];
else
DP[i][j]=max(DP[i+1][j],DP[i+1][j-w[i]]+v[i]);
}
}
cout<<DP[0][W]<<endl;
}