java经典递归 背包问题

java经典递归 背包问题

1.引出

出去旅游,但背包有限,吃的喝的用的都有各自的体积大小,以重量为例,引出问题,该怎样选择装物品能正好装满背包!

2.应用

在一个物品向量中找到一个子集满足条件如下 :

1)所有物品加起来的重量大小,小于等于背包总值

  1. 所以单个物品不大于背包总值,并满足条件1

递归问题.
这个背包可以放入物品的重量为weight,现在n件物品,重量分别为w[0],w[1]…w[n - 1].问题是能否从这n件物品中选择若干件放入此背包中使得放入的重量之和正好等于weight.
试用简单缜密的递归逻辑实现

不说别的直接上代码!

这是一个简单的例子!

Integer[]  weights = {1,5,7,6,7,4};
Integer weight = 18;
void main(){
	 pack(weight,0);
}
boolean pack(int weight,int num){

		if(weight == 0)
			return true;
			
		if((weight > 0 && num >= (weights.length - 1)) || weight < 0 )
			return  false;

		if(pack(weight - weights[num],num + 1)){
			System.out.println("num: "+ (num +1 ) +" weight: " + weights[num]);
			return true;
		}

		if(pack(weight,num+1))
			return true;
		else
			return false;
	}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
背包问题是一个经典的动态规划问题归是其中一种解法。我将使用Java编程语言实现归解法来输出所有解。 首先,我们需要定义一个归函数来解决背包问题。这个函数的参数包括背包的容量、物品的重量数组、物品的价值数组以及当前处理到的物品索引。 归函数的实现如下所示: ```java public static void recursion(int capacity, int[] weights, int[] values, int index, ArrayList<Integer> result) { if (index >= weights.length || capacity <= 0) { // 输出当前解 System.out.println(result); return; } // 不选择当前物品 recursion(capacity, weights, values, index + 1, result); // 如果当前物品的重量小于等于背包容量,选择当前物品 if (weights[index] <= capacity) { result.add(index); recursion(capacity - weights[index], weights, values, index + 1, result); result.remove(result.size() - 1); } } ``` 接下来,我们可以编写一个辅助函数来调用归函数,传入相应的参数。 ```java public static void printAllSolutions(int capacity, int[] weights, int[] values) { ArrayList<Integer> result = new ArrayList<>(); recursion(capacity, weights, values, 0, result); } ``` 最后,我们可以在主函数中测试上述函数的结果。首先定义物品的重量和价值数组,然后调用`printAllSolutions`函数。 ```java public static void main(String[] args) { int capacity = 10; int[] weights = {2, 3, 4, 5}; int[] values = {3, 4, 5, 6}; printAllSolutions(capacity, weights, values); } ``` 这样,程序将会输出所有的解,每一行是一个解,以列表的形式展示选中的物品索引。 希望这个回答能够帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值