递归算法 背包问题

java 递归算法 背包问题!!
背包问题.设有一个背包可以放入物品的重量为s,现在n件物品,重量分别为w[0],w[1]......w[n-1].问题是能否从这n件物品中选择若干件放入此背包中使得放入的重量之和正好等于s. 如果存在一种符合上述要求的选择,则称此背包问题有解;否则称此背包问题无解. 试用分而治之的算法设计求解背包问题的函数. 
  提示:此背包问题的递推定义如下(其中true表示有解,false表示无解):
knap(s,n)={true s=0 此时问题有解
knap(s,n)={ flase s<0 总重量不能为负解
knap(s,n)={flase s>0且n<1 物品件数不能为负数
knap(s,n)={knap(s,n-1) s>0且n>=1 所选物品不包括w[n-1]时
knap(s,n)={knap(s-w[n-1],n-1) s>0且n>=1 所选物品包括w[n-1]时

public void beibao(int[] intArray,int start,int sum){
//参数说明
//intArray:从大到小排序的物品重量数组
//start:从数组的哪一个元素开始往包里面放
//sum:包能够装的重量
if(start >= intArray.length){
System.out.println("此题无解");
return;
}
if(intArray[start] > sum){
this.beibao(intArray,start+1,sum);
}else if(intArray[start] == sum){
System.out.println("此题有解");
return;
}else{
this.beibao(intArray,start+1,sum-intArray[start]);
}
}
又复习了一遍分治法,如果要记录下放进包里的是哪几件物品,还要想一想。。。。。

*
 * Created on 2006-11-13
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - java - Code Style - Code Templates
 */
package net.dzf.fenzhifa;
 
/**
 * @author dengzhangfan
 * 用分治法解决背包问题
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - java - Code Style - Code Templates
 */
 
public class fenzhifa {
 
 private static fenzhifa obj = new fenzhifa();
 
 public void beibao(int[] intArray,int start,int left,int sum){
  //参数说明
  //intArray:从大到小排序的物品重量数组
  //start:从数组的哪一个元素开始往包里面放
  //left:包还能装的重量
  //sum:包能够装的总重量
  if(intArray.length == 0){
   System.out.println("无解");
   return;
  }
  if(start == intArray.length){
   System.out.println("回朔开始");
   int[] another = new int[intArray.length - 1];
   for(int i=0;i<another.length;i++){
    another[i] = intArray[i+1];
   }
   obj.beibao(another,0,sum,sum);
  }
  else if(intArray[start] > left){
   obj.beibao(intArray,start+1,left,sum); 
  }else if(intArray[start] == left){
   System.out.println("此题有解");
   return;
  }else{
   obj.beibao(intArray,start+1,left-intArray[start],sum);
  }
 }
 
 
 public static void main(String[] args){
     int[] intArray = {9,8,5,3,2};
     obj.beibao(intArray,0,15,15);
 }
 
 
}


public class Test {
/**
* 返回给定数组中除去第一个元素后的子数组
* @param intArray
* @return
*/
private static int[] getSubArray(int[] intArray) {
int[] another = new int[intArray.length - 1];
for (int i = 0; i < another.length; i++) {
another[i] = intArray[i + 1];
}
return another;
}

/**
* 返回一个背包问题是否有解
* @param intArray 物品重量数组(无需排序)
* @param sum 包能够装的总重量
* @return
*/
private static boolean beibao2(int[] intArray, int sum) {
if (intArray.length == 0)
return false;
if (intArray[0] == sum) {
return true;
} else if (intArray[0] > sum) {
return beibao2(getSubArray(intArray), sum);
} else {
if (beibao2(getSubArray(intArray), sum - intArray[0])) {
return true;
} else {
return beibao2(getSubArray(intArray), sum);
}
}
}

public static void main(String[] args) {
int[] intArray = { 9, 6, 5, 4, 2 };
String result = beibao2(intArray, 16) ? "有解" : "无解";
System.out.println(result);
}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值