java 实现穷举算法

参考:https://blog.csdn.net/changyuanchn/article/details/51417796

题目
/**
 * 
 * [0-1背包问题]有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。
 * 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
 * 物品 A    B    C   D    E    F    G
 * 重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
 * 价值 10   40   30  50   35   40   30
 */

其核心主要是如何穷举对象,对象有多少种组合排列,通过所有组合排列,遍历组合计算出最优的解

 

1.对象有多少种组合,一共有 n个物品 组合数量:C(0,n),C(1,n),C(2,n),……C(n-2,n),C(n-1,n),C(n,n) = 2^n

2.java 如何生成2^n种组合,参考https://blog.csdn.net/changyuanchn/article/details/51417796的实现,下列java代码中 genPowerSet 方法可得出组合,核心是通过0到2^n的二进制字符串遍历,可得每种组合,

3.计算出最优解

下面直接贴代码

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public clas
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法基础篇 **章 算法实现算法Java语法 1.1 建立算法初步概念 1.1.1 什么是算法 1.1.2 算法的发展历史 1.1.3 算法的分类 1.2 算法相关概念的区别 1.2.1 算法与公式的关系 1.2.2 算法与程序的关系 1.2.3 算法与数据结构的关系 1.3 算法的表示 1.3.1 自然语言表示 1.3.2 流程图表示 1.3.3 N-S图表示 1.3.4 伪代码表示 1.4 算法的性能评价 1.4.1 时间复杂度 1.4.2 空间复杂度 1.5 一个算法实例 1.5.1 查找数字 1.5.2 创建项目 1.5.3 编译执行 1.6 Java程序的基本结构 1.6.1 类是一个基本单元 1.6.2 main方法 1.6.3 自定义方法 1.6.4 System.out.println的使用 1.6.5 一个简单而完整的程序 1.7 顺序结构 1.8 分支结构 1.8.1 if...else分支结构 1.8.2 if...else嵌套 1.8.3 switch语句 1.8.4 编程实例 1.9 循环结构 1.9.1 while循环 1.9.2 do…while循环 1.9.3 for循环 1.9.4 编程实例 1.10 跳转结构 1 1.10.3 编程实例 1.11 小结 第2章 数据结构 2.1 数据结构概述 2.1.1 什么是数据结构 2.1.2 数据结构中的基本概念 2.1.3 数据结构的内容 2.1.4 数据结构的分类 2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3 顺序表结构 2.3.1 准备数据 2.3.2 初始化顺序表 2.3.3 计算顺序表长度 2.3.4 插入结点 2.3.5 追加结点 2.3.6 删除结点 2.3.7 查找结点 2.3.8 显示所有结点 2.3.9 顺序表操作实例 2.4 链表结构 2.4.1 什么是链表结构 2.4.2 准备数据 2.4.3 追加结点 2.4.4 插入头结点 2.4.5 查找结点 2.4.6 插入结点 2.4.7 删除结点 2.4.8 计算链表长度 2.4.9 显示所有结点 2.4.10 链表操作实例 2.5 栈结构 2.5.1 什么是栈结构 2.5.2 准备数据 2.5.3 初始化栈结构 2.5.4 判断空栈 2.5.5 判断满栈 2.5.6 清空栈 2.5.7 释放空间 2.5.8 入栈 2.5.9 出栈 2.5.10 读结点数据 2.5.11 栈结构操作实例 2.6 队列结构 2.6.1 什么是队列结构 2.6.2 准备数据 2.6.3 初始化队列结构 2.6.4 判断空队列 2.6.5 判断满队列 2.6.6 清空队列 2.6.7 释放空间 2.6.8 入队列 2.6.9 出队列 2.6.10 读结点数据 2.6.11 计算队列长度 2.6.12 队列结构操作实例 2.7 树结构 2.7.1 什么是树结构 2.7.2 树的基本概念 2.7.3 二叉树 2.7.4 准备数据 2.7.5 初始化二叉树 2.7.6 添加结点 2.7.7 查找结点 2.7.8 获取左子树 2.7.9 获取右子树 2.7.10 判断空树 2.7.11 计算二叉树深度 2.7.12 清空二叉树 2.7.13 显示结点数据 2.7.14 遍历二叉树 2.7.15 树结构操作实例 2.8 图结构 2.8.1 什么是图结构 2.8.2 图的基本概念 2.8.3 准备数据 2.8.4 创建图 2.8.5 清空图 2.8.6 显示图 2.8.7 遍历图 2.8.8 图结构操作实例 2.9 小结 第3章 基本算法思想 3.1 常用算法思想概述 3.2 穷举算法思想 3.2.1 穷举算法基本思想 3.2.2 穷举算法实例 3.3 递推算法思想 3.3.1 递推算法基本思想 3.3.2 递推算法实例 3.4 递归算法思想 …… 第2篇 算法应用篇 第4章 排序算法 第5章 查找算法 第6章 基本数学问题 第7章 数据结构问题 第8章 数论问题 第9章 算法经典趣题 **0章 游戏中的算法 **1章 密码学概述 **2章 压缩与解压缩算法 第3篇 算法面试篇 **3章 数学能力测试 **4章 算法面试题
多机调度问题是一种经典的 NP-hard 问题,它的目标是一些任务分配到若干台机器,使得完成所有任务所需的时间最短。穷举是一种朴素的求算法,它通过枚举所有可能的任务分配方案来寻找最优解。 是Java代码实现穷举法解决多机调度问题的示例: ```java public class BruteForceScheduler { /** * 计算完成所有任务的最短时间 * * @param tasks 待分配的任务数组 * @param machines 机器数量 * @return 最短时间 */ public static int schedule(int[] tasks, int machines) { int[] machineTimes = new int[machines]; // 记录每台机器的完成时间 int minTime = Integer.MAX_VALUE; // 记录最短时间 // 枚举所有可能的任务分配方案 for (int i = 0; i < Math.pow(machines, tasks.length); i++) { int[] assignment = new int[tasks.length]; int n = i; for (int j = 0; j < tasks.length; j++) { assignment[j] = n % machines; n /= machines; } // 计算完成当前方案下所有任务所需的时间 for (int j = 0; j < machines; j++) { machineTimes[j] = 0; } for (int j = 0; j < tasks.length; j++) { machineTimes[assignment[j]] += tasks[j]; } int time = 0; for (int j = 0; j < machines; j++) { time = Math.max(time, machineTimes[j]); } // 更新最短时间 minTime = Math.min(minTime, time); } return minTime; } public static void main(String[] args) { int[] tasks = { 2, 5, 7, 10, 1 }; int machines = 3; int minTime = schedule(tasks, machines); System.out.println("最短时间:" + minTime); } } ``` 在上述代码中,我们首先定义了一个 `schedule` 函数来计算所有可能的任务分配方案,并返回完成所有任务的最短时间。该函数接受两个参数:待分配的任务数组和机器数量。 在函数内部,我们首先枚举所有可能的任务分配方案。对于每种方案,我们首先将任务分配给各个机器,并记录每台机器的完成时间。然后,我们计算完成当前方案下所有任务所需的时间,并将其与当前最短时间比较,更新最短时间。最后,我们返回最短时间作为结果。 在 `main` 函数中,我们定义了一个示例任务数组和机器数量,并调用 `schedule` 函数来求解最短时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值