装载问题java_回溯算法之装载问题(Java实现)

该博客介绍了一个使用回溯法解决的装载问题,具体情境为将n个集装箱合理分配到载重分别为c1和c2的两艘轮船上。通过Java代码示例展示了如何实现递归程序,确保集装箱总重量不超过两艘船的总载重。示例中给出了不同集装箱重量组合下的装载方案判断。
摘要由CSDN通过智能技术生成

问题描述

用回溯法编写一个递归程序解决如下装载问题:

有 n 个集装箱要装上 2 艘载重分别为 c1 和 c2的轮船,其中集装箱 i 的

重量为 wi(1≤ i ≤ n),且∑ 𝑤𝑖 ≤ 𝑐1 + 𝑐2 。

问是否有一个合理的装载方案可以将这 n 个集装箱装上这 2 艘轮船?如果有,请给出装载方案。

示例

当 n=3,c1=c2=50,且 w=[10,40,40]时,可以将集装箱 1 和 2 装到第一艘轮船上,集装箱3装到第二艘轮船上;

如果 w=[20,40,40]时,无法将这 3 个集装箱都装上轮船。

Java代码

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class Load {

public static int weight1; //记录第一艘船的载重能力

public static int weight2; //记录第二艘船的载重能力

public static int sum1 = 0,sum2 = 0; //分别代表此时第一艘船的载重和所有集装箱的总重量

public static int[] arr; //记录集装箱的重量

public static int n; //集装箱的个数

public static List list = new ArrayList(); //第一艘船的集装箱的装载的重量

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

n = scanner.nextInt();

arr = new int[n];

weight1 = scanner.nextInt();

weight2 = scanner.nextInt();

for (int i = 0; i < n; i++) {

arr[i] = scanner.nextInt();

sum2 += arr[i];

}

scanner.close();

backtrack(0);

}

public static void backtrack(int i) {

if(sum1 > weight1) { // 如若超载,则回溯

return;

}

if(i == n) {

if(sum2 - sum1 < weight2) {

System.out.println(list);

}

return;

}

sum1 += arr[i];

list.add(arr[i]);

backtrack(i+1);

sum1 -= arr[i];

list.remove(list.size()-1);

backtrack(i+1);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值