背包问题的递归

背包问题的递归(动规)

有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
1≤n≤100
1≤wi,vi≤100
1≤W≤10000
输入:
n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5
输出:
7(选择第0,1,3号物品)
因为对每个物品只有选和不选两种情况,所以这个问题称为01背包。
选?不选? 和贪心的区别就在这,可以选或者不选
*/
package _9动规;

public class _01背包问题递归 {//递归复杂度为2^n的复杂度
static int []w= {2,1,3,2};//价值表
static int[]v= {3,2,4,2};//背包的承重极限
static int n=4;//物品数量
static int W=5;//背包的承重极限;
public static void main(String[] args) {
int ww=W;//复制一下
int ans=dfs(0,ww);//方法,传入第一个开始和总重量
System.out.println(ans);
}
private static int dfs(int i, int ww) {
// TODO Auto-generated method stub
if(ww<=0)return 0;//出口装不进去了,总量没有容量
if(i==n)return 0;//没有东西可选了
int v2=dfs(i+1,ww);//不选择当前物品

if(ww>=w[i]) {//选当前物品
   int v1=v[i]+dfs(i+1,ww-w[i]);//选着当前物品
  return Math.max(v1, v2);
}else {
	return v2;	
}

}
}

猜你喜欢

转载自blog.csdn.net/weixin_45952706/article/details/107922952