求解一个集合中是否能组成某个数-子集问题
【求解一个集合中是否能组成某个数-子集问题】
求解一个集合中是否能组成某个数-子集问题
public class SubSet { public static void main(String[] args) {
// 求数组中能否组成9 子集问题 以下数中能否组成9 -只考虑正数集合
// 负数动态规划难以创建记录对应关系 正数下限为0 负数无下限
int arr1[] = { 3, 34, 4, 12, 5, 2 };
System.out.println("递归求解:" + recSubSet(arr1, 5, 9));
System.out.println("动态规划求解:" + dpSubSet(arr1, 9));
} // 递归实现 子集问题
public static boolean recSubSet(int[] arr, int i, int s) {// 剩余要拼的数归零 说明已经拼完了 递归出口
if (s == 0) {
return true;
}// 拼到最后一位 发现这个数正好是剩下需要的数 递归出口
if (i == 0) {
return arr[i] == s;
}// 此运算值计算正整数值
// 若当前数值大于剩余所要凑的数值 规定为不能选 因为会出现负数
if (arr[i] > s) {
return recSubSet(arr, i - 1, s);
}// 两种情况 选或不选
// 选
boolean a = recSubSet(arr, i - 1, s - arr[i]);
// 不选
boolean b = recSubSet(arr, i - 1, s);
// a b 两种任一种成立 则成立return a || b;
} // 动态规划 子集问题
public static boolean dpSubSet(int[] arr, int s) {
boolean[][] opt = new boolean[arr.length][s + 1];
for (int i = 0;
i < opt.length;
i++) {
for (int j = 0;
j <= s;
j++) {
if (i == 0) {
opt[i][j] = false;
if (arr[i] == j) {
opt[i][j] = true;
}
continue;
}if (j == 0) {
opt[i][j] = true;
continue;
}if (arr[i] > j) {
opt[i][j] = opt[i - 1][j];
//不选
continue;
}// 选
boolean a = opt[i - 1][j - arr[i]];
// 不选
boolean b = opt[i - 1][j];
opt[i][j] = a || b;
}
}System.out.println();
// 计数表
System.out.println("=======动态规划记录表注:【X false】【O true】========");
for (int i = 0;
i < opt[0].length;
i++) {
System.out.print(i + "");
}System.out.println("===>arr[i] 每一个集合项的值, 可扩展,无限添加集合项");
System.out.println("----------------------------------------------");
for (int i = 0;
i < opt.length;
i++) {
for (int j = 0;
j < opt[i].length;
j++) {
System.out.print(opt[i][j] ? "O" : "X");
System.out.print("");
}System.out.print("===>");
System.out.print(arr[i]);
System.out.println();
}// 取数组最大区间和所定义最大值s位置所存储的值 有没有 来决定是否能拼装出结果
return opt[arr.length - 1][s];
}
}
附执行结果如下:
递归求解:true=======动态规划记录表注:【X false】【O true】========
0123456789===>arr[i] 每一个集合项的值, 可扩展,无限添加集合项
----------------------------------------------
XXXOXXXXXX===>3
OXXOXXXXXX===>34
OXXOOXXOXX===>4
OXXOOXXOXX===>12
OXXOOOXOOO===>5
OXOOOOOOOO===>2
动态规划求解:true
推荐阅读
- 一个人的旅行,三亚
- 一个小故事,我的思考。
- 一个人的碎碎念
- 七年之痒之后
- 我从来不做坏事
- 异地恋中,逐渐适应一个人到底意味着什么()
- 图书集合完毕
- 迷失的世界(二十七)
- live|live to inspire 一个普通上班族的流水账0723
- 遗憾是生活的常态,但孝顺这件事,我希望每一个人都不留遗憾