小红书——薯券使用

问题描述:
某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来
购买一批商品,求有多少种购买组合。其中一件商品可以买多件。
输 入:薯券金额、商品分别价格
输出 :组合数
输入描述:
输入薯券金额、商品分别价格
例如: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];

		// 将字符串 [2,3,5] 转化成字符串数组 [2,3,5],即面额数组
		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种  	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bu Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值