问题描述:
某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来
购买一批商品,求有多少种购买组合。其中一件商品可以买多件。
输 入:薯券金额、商品分别价格
输出 :组合数
输入描述:
输入薯券金额、商品分别价格
例如:10 [2,3,5]
10与[2,3,5]中间有空格
输出描述:
输出4,则结果集可以为:2,2,2,2,2;5,5;2,3,5;2,2,3,3共有4种组合
示例输入:
10 [2,3,5]
示例输出:
4
代码:
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
int n = Integer.parseInt(line.split(" ")[0]);
String string = line.split(" ")[1];
String[] str = string.substring(1, string.length() - 1).split(",");
int[] money = new int[str.length];
for (int i = 0; i < money.length; i++) {
money[i] = Integer.parseInt(str[i]);
}
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i : money) {
System.out.println("i = " + i);
for (int j = i; j < dp.length; j++) {
dp[j] = dp[j] + dp[j - i];
System.out.print("j = " + j + "\t");
System.out.println("dp[" + j + "] = " + "dp[" + j + "]" + " + dp[" + (j - i) + "] = " + dp[j]);
}
System.out.println("--------------------------------------");
}
System.out.println("共有:" + dp[n]);
}
个人见解:动态规划,大问题分割成若干个小问题,小问题的结果又对大问题的结果有直接的关系,需将小问题的结果保存起来。(仅个人片面理解)
i : 当前面额 [2,3,5]
j : 当前总金额
dp[j] : 表示当前总的组合数。
i = 2 时:表示只有2元面额的,j取2~10,表示总金额为2~10的
时候,只使用面额为2元的能有多少种。
例:
i = 2 时:
j = 2:【2】- 1种
j = 3: 无 - 0种
j = 4:【2,2】 - 1种
j = 5:无 - 0种
j = 6:【2,2,2】 - 1种
j = 7:无 - 0种
j = 8:【2,2,2,2】 - 1种
j = 9:无 - 0种
j = 10:【2,2,2,2,2】 - 1种
i = 3 时:表示有面额为2 和 3元的,计算3元的面额在2元面额的基础上累加。
j = 3 :【3】 - 1种
j = 4 :[2,2] - 1 种(i = 2的时候计算出来的)
j = 5 :【2,3】 - 1种
j = 6 :[2,2,2](i = 2的时候计算出来的)、【3,3】 - 2种
j = 7 :【2,2,3】 - 1种
j = 8 :[2,2,2,2](i = 2的时候计算出来的)、【3,,3,2】 - 2种
j = 9 :【2,2,2,3】、【3,3,3]】- 2种
j = 10 :[2,2,2,2,2](i = 2的时候计算出来的)、【2,2,3,3】- 2种
i = 5 时:表示有面额为2元 、 3元和5元的,计算5元的面额在2元和3元面额的基础上累加。
j = 5 :[2,3] (i = 3的时候计算出来的)、【5】- 2种
j = 6 :[2,2,2](i = 2的时候计算出来的)、[3,3](i = 3的时候计算出来的) - 2种
j = 7 :[2,2,3] (i = 3的时候计算出来的)、【2,5】- 2种
j = 8 :[2,2,2,2](i = 2的时候计算出来的)、[3,3,2](i = 3的时候计算出来的)、【3,5】 - 3种
j = 9 :[2,2,2,3](i = 2的时候计算出来的)、[3,3,3](i = 3的时候计算出来的)、【2,2,5】 - 3种
j = 10 :[2,2,2,2,2](i = 2的时候计算出来的)、[2,2,3,3] (i = 3的时候计算出来的)、【2,3,5】、【5,5】- 4种