package com.test.algorithm.dp;
import java.util.HashSet;
import java.util.Set;
/**
* @author hawkinswang
*
* 01背包问题:在指定数组中挑选任意组合,让它们的和等于一个特定值,列出所有组合方式
* 使用动态规划方法解决,状态转移方程:dp[i][j]=dp[i-arr[j]][j-1].add(arr[j])
*
*/
public class FindComineEqualSum {
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 7, 8, 9, 10, 2, 4, 6 };
int sum = 11;
Set<String> combines = findCombine(arr, sum);
for (String combine : combines) {
if (combine != null) {
System.out.println("the result is:" + combine);
}
}
}
private static Set<String> findCombine(int[] arr, int sum) {
Set<String> result = new HashSet<String>();
Set<String>[][] dp = new HashSet[sum + 1][arr.length + 1];
int i = 0, j = 0;
for (j = 0; j < arr.length + 1; j++) {// 当求和为0时,初始化为"";非常重要,这是动态规划数组产生合理组合的基础.
dp[0][j] = new HashSet<String>();
dp[0][j].add("");
}
for (i = 1; i <= sum; i++) {
for (j = 1; j <= arr.length; j++) {
for (int k = 0; k <= j - 1; k++) {
if (dp[i][k] != null && dp[i][k].size() > 0) {
if (dp[i][j] == null) {
dp[i][j] = new HashSet<String>();
}
dp[i][j].addAll(new HashSet<String>(dp[i][k]));
}
}
if (i >= arr[j - 1] && dp[i - arr[j - 1]][j - 1] != null) {
if (dp[i][j] == null) {
dp[i][j] = new HashSet<String>();
}
for (String str : dp[i - arr[j - 1]][j - 1]) {
dp[i][j].add(str + "," + arr[j - 1]);
}
}
}
// readArray(dp);
}
for (Set<String> Set : dp[sum]) {
if (Set != null) {
result.addAll(Set);
}
}
return result;
}
private static void readArray(String[][] dp) {
for (String[] arr : dp) {
for (String str : arr) {
System.out.print(str + "/");
}
System.out.println();
}
System.out.println("end");
}
}
分享到:
相关推荐
组合逻辑电路的设计不仅限于一些特定的应用场景,它还是更复杂数字系统的基础。掌握组合逻辑电路的基本分析和设计技能,有助于深入理解和应用数字电子技术,在设计更高级的电子系统时也能够更加游刃有余。通过本章的...
当存在特定的限制条件时,如例题4中的数字之和必须大于8,我们需要在罗列过程中注意这些条件,按一定的顺序进行,避免重复和遗漏。 5. **循环赛问题**: 例题5讨论的是循环赛的场次计算。在循环赛中,每个队伍都...
通过对排列问题的学习和应用,我们不仅能够掌握解决实际问题的数学工具,还能够在解决问题的过程中培养和提高我们的思维能力。对于学生来说,理解和掌握排列问题的解决方法,无疑将为他们未来的学习和研究打下坚实的...
在准备数字电子技术(数电)的期末复习时,我们需要关注多个关键知识点和例题,以便有效备考。以下是对这些内容的详细解析: 一、数选器与奇偶校验电路设计 4选1数选器74LS153可以用于实现奇偶校验电路。奇偶校验...
例如,例题1中要求在图形中填入数字,使得每边7个小三角形内数字之和相等,并求最大和。我们可以通过观察和分析,将最小的数填在中心位置,最大的数填在角上,以此类推,逐步构建出满足条件的最大和。 例题2中涉及...
通过学习这一方法,学生能够系统地罗列出所有可能的情况,进而在解决问题时做到既不遗漏也不重复。本文以“2013青岛版二年级上学期智慧广场——分类列举-2.ppt”为依托,深入探讨分类列举法在数学教育中的重要性及其...
- **设计简单的数字电路**:通过已知逻辑函数式,可以设计出对应的逻辑电路,实现特定的逻辑运算功能。 - **数字系统分析**:在分析数字系统时,能够将逻辑函数转换为真值表,进而分析系统的逻辑行为。 - **软件仿真...
通过实际的购物问题,比如如何用19元去购买玩具,孩子们不仅需要找出特定金额的组合,还要理解“哪些”意味着所有可能的组合。这种开放式的问题设计,极大地锻炼了孩子们的逻辑思维和综合应用能力。 为了进一步巩固...
在初中数学的学习中,概率问题一直是学生挑战的重点之一。特别是在处理等可能条件下的概率时,画树状图法是一种非常有效的解决问题的方法。这种方法能够帮助学生清晰地罗列所有可能的情况,并且能够系统地计算出特定...
数位填充问题同样重要,它要求解题者在特定的条件下考虑数字在不同位置上的组合。这通常出现在需要满足横行和竖行的和相等,或者数字的乘积相等的情况中。 数字填充策略的运用,不仅需要考虑数字的运算特性,还需...
例如,“FP”代表某种型号的按钮开关,后续的字母和数字组合则标识着具体的尺寸、安装方式、电压等级和电气特性等。在工业自动化的开关选型中,以下几个关键知识点是非常重要的: 1. 开关类型:用户需要根据实际...
11. 题目61至65中出现了各种数字组合和字母,但无法从片段中明确判断具体的考察内容。 12. 题目67和68中出现了10EH和10DH,这些可能是十六进制数表示的数字,通常用在内存地址或某些寄存器的表示上。 13. 题目70至...
此外,文档中提到的一些符号和数字的组合,如“80%”、“24(911)”等,很可能是表示某种状态的百分比或与紧急事件相关的代码,例如与911相关的代码可能表示紧急状态或紧急服务的联系方式。而“P12Phoenix”、“P***%...
学生通过给出的数字和条件,推断出序列中特定位置的数值。这类题目不仅考验学生的逻辑推理能力,也帮助他们深入理解数字的性质和规则。 #### 不等式与整数解的寻找 不等式和整数解的寻找是高年级数学中较为复杂的...
6. 计算数论:研究数字计算中的问题,特别是在大整数的因式分解、素数检验和计算模算术中,这在密码学和现代统计方法中尤其重要。 7. 组合数学:数论与组合数学有着密切的联系,组合设计和有限几何等领域都可能受益...
这里,`John`、`Jill`等是`students`集的成员,而`1`和`0`分别代表男性和女性,数字代表年龄。 ##### 3.3 注释 使用感叹号(!)开始的行被视为注释行,可以在代码中添加说明文字,如: ```lingo ! 集部分; sets: ...
例如,在双面板设计中,设计师可以参考文档中列举的不同厚度和材料组合,这些结构通常以诸如“50/100 || 0.5mm”这样的形式表达,表示铜箔厚度为50微米和100微米,以及层与层之间的介质厚度为0.5毫米。在实际设计中...
报告中罗列的数字和百分比,涵盖了从P25到P90的薪资百分位数,以及中位数和不同所有制类型企业的薪酬数据。我们了解到,威海地区陆路运输主管的薪酬水平在不同企业类型中存在差异,包括外商独资企业、合资企业、当地...
ADM模块集成了模拟和数字信号的处理,以更高效地解决工业自动化中的复杂问题。机器人控制器(CHASU-N)则是用于机器人的运动控制,确保机器人的精确操作和运动协调。 输入输出模块(I/O Modules)用于连接和处理...