求数组中和为给定数的所有组合详解编程语言

import java.util.Arrays; 
public class Test {
 
public static void main(String[] args) {
 
String str = "6,2,7,3,8,1,9,4"; 
double sum = 12; 
diguiSum(str, sum); 
} 
public static void diguiSum(String str, double sum) {
 
String[] x = str.split(","); 
double[] array = arrayTransform(x); 
for (int i = 0; i < 100; i++) {
 
double[] cache = new double[i + 1]; 
int ceng = -1; 
int cengQuit = i; 
int startPiont = 0; 
cir(ceng, cengQuit, startPiont, array, cache, sum); 
} 
} 
// 递归求结果 
public static void cir(int ceng, int cengQuit, int startPiont, 
double[] array, double[] cache, double sum) {
 
ceng++; 
for (int i = startPiont; i < array.length; i++) {
 
cache[ceng] = array[i]; 
if (ceng == cengQuit) {
 
if (getSum(cache) == sum) {
 
printcache(cache); 
} 
if (getSum(cache) > sum) {
 
break; 
} 
} 
if (ceng < cengQuit) {
 
startPiont = i + 1; 
cir(ceng, cengQuit, startPiont, array, cache, sum); 
} 
} 
} 
// 获取组合数字之和 
public static double getSum(double[] cache) {
 
double sum = 0; 
for (int i = 0; i < cache.length; i++) {
 
sum = sum + cache[i]; 
} 
return sum; 
} 
// 打印组合的可能 
public static void printcache(double[] cache) {
 
for (int i = 0; i < cache.length; i++) {
 
System.out.print(cache[i] + ","); 
} 
System.out.println(); 
} 
// 转换数组类型 且为提高效率做准备 
public static double[] arrayTransform(String[] strArray) {
 
int length = 0; 
double[] array = new double[strArray.length]; 
for (int i = 0; i < strArray.length; i++) {
 
array[i] = Double.valueOf(strArray[i]); 
} 
Arrays.sort(array); 
for (int i = 0; i < array.length; i++) {
 
if (array[i] > 100) {
 
length = i; 
break; 
} 
} 
double[] dest = new double[length]; 
if (length == 0) {
 
return array; 
} 
System.arraycopy(array, 0, dest, 0, length); 
return dest; 
} 
} 

输出结果为:

3.0,9.0, 
4.0,8.0, 
1.0,2.0,9.0, 
1.0,3.0,8.0, 
1.0,4.0,7.0, 
2.0,3.0,7.0, 
2.0,4.0,6.0, 
1.0,2.0,3.0,6.0, 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/19177.html

(0)
上一篇 2021年7月19日 21:45
下一篇 2021年7月19日 21:45

相关推荐

发表回复

登录后才能评论