public class CombinationSum {
public static void main(String[] args) {
int target = 100;
int[] numbers = {1, 2, 5};
int count = countCombinations(target, numbers);
System.out.println("组合个数: " + count);
}
public static int countCombinations(int target, int[] numbers) {
// 创建一个数组来存储每个目标值的组合个数
int[] dp = new int[target + 1];
dp[0] = 1; // 初始条件:和为 0 的组合个数为 1(即不选任何数)
// 动态规划计算每个目标值的组合个数
for (int num : numbers) {
for (int i = num; i <= target; i++) {
dp[i] += dp[i - num];
}
}
return dp[target];
}
}
代码说明
-
主函数:
- 定义目标值
target为 100。 - 定义可用的数字数组
numbers为 {1, 2, 5}。 - 调用
countCombinations函数计算组合个数并输出结果。
- 定义目标值
-
countCombinations 函数:
- 使用动态规划方法来计算组合个数。
- 创建一个数组
dp,其中dp[i]表示和为i的组合个数。 - 初始化
dp[0]为 1,表示和为 0 的组合个数为 1(即不选任何数)。 - 遍历每个可用的数字
num,更新dp数组中的值。 - 对于每个
num,从num到target进行遍历,更新dp[i]的值为dp[i] + dp[i - num]。
-
输出结果:
- 最后返回
dp[target],即和为 100 的组合个数。
- 最后返回