装载问题java

编程入门 行业动态 更新时间:2024-10-09 23:19:43

装载问题<a href=https://www.elefans.com/category/jswz/34/1770091.html style=java"/>

装载问题java

问题描述

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

有 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);

}

}

更多推荐

装载问题java

本文发布于:2024-03-23 21:30:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1743058.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!