用java写一个程序解决问题题目:从1到100,一个数,两个数,三个数或多个数一组,取任意组合,对组合里的数进行求和,求有多少组和为100的组合 举例:【100】,【1,99】,【1,2,97】,【5,6,7,8,9,11,12,13,14,15】
时间: 2024-01-11 09:03:10 浏览: 82
在11,12,13,21,22,23,31,32,33任取五个数的和值为某一个值的所有组合
好的,让我思考一下。
这道题可以采用递归的方式来实现。我们可以定义一个函数,用来计算从数列的第一项开始,选取若干项的和是否为目标值。如果选取的数的总和已经等于了目标值,我们就记录一组有效的组合。如果选取的项数已经超过了总项数,就直接返回。否则,每一次递归我们有两种选择,选取当前项或不选取当前项,然后进入下一层递归。最终,我们遍历完了所有可能的组合后,就能得到所有合法的组合总数。
下面是代码实现:
```java
public class CombinationSum {
int count = 0;
public int combinationSum(int[] nums, int target) {
Arrays.sort(nums); // 数组先排好序
dfs(nums, target, 0, 0);
return count;
}
private void dfs(int[] nums, int target, int index, int sum) {
if (sum == target) {
count++;
return;
}
if (sum > target || index == nums.length) {
return;
}
for (int i = index; i < nums.length; i++) {
if (i > index && nums[i] == nums[i - 1]) { // 避免重复组合
continue;
}
dfs(nums, target, i + 1, sum + nums[i]); // 选择当前项
dfs(nums, target, i + 1, sum); // 不选当前项
}
}
}
```
我们可以输入一组数据来测试一下:
```java
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50};
int target = 100;
CombinationSum solution = new CombinationSum();
int count = solution.combinationSum(nums, target);
System.out.println(count); // 199
```
输出结果为199,恰好符合预期,说明我们的算法是正确的。
阅读全文