问题 B: icebound的商店

探讨icebound神秘商店中,通过动态规划算法计算在特定预算下免费获取商品的方案数量。博客详细解析了一个Java实现的例子,展示了如何利用动态规划解决这类组合计数问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 B: icebound的商店

时间限制: 1 Sec  内存限制: 64 MB

题目描述

icebound在得到神殿的宝藏之后,开了一家神秘的商店。你来到了商店,发现慷慨的icebound搞了T次促销活动。在每 次促销活动中,icebound都会想出一个他喜欢的数字,如果你买的商品的总价刚好等于icebound喜欢的数字,那么你就 可以免费得到这些商品。
icebound的商店里一共有15件商品,商品的价格和这家商店一样神秘,第一件商品的价格是1元,第二件商品的价格 是2元,设第n件商品的价格为wn元,则:wn = wn−1 + wn−2(3 ≤ n ≤ 15)。
如果在某次活动中icebound喜欢的数字是 4,那么共有 种购买方案:
1. 买4个 第一种商品  
2. 买4个 第一种商品 和1个 第二种商品  
3. 买2个 第二种商品  
4. 买1个 第一种商品 和1个 第三种商品  
请你算出共有多少种方案可以免费购物,方案数对1000000009(109+9)取模。

输入

第一行给出一个整数T,表示icebound搞了T次活动。
接下来的T行每行给出一个正整数 x,表示在这次活动中icebound喜欢的数字。
(1 ≤ T ≤ 3000, 1 ≤ x ≤ 3000)

输出

输出T行,每行输出一个正整数。
i行的正整数表示在第次活动中免费购物的方案数,方案数对1000000009(109+9)取模。

样例输入

3
5
20
30

样例输出

6
134
509

代码(dp动态规划类型):

import java.util.Scanner;

public class four {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		
		int s[] = new int[16];
		s[1] = 1;
		s[2] = 2;
		for (int i = 3; i < 16; i++) {
			s[i] = s[i-1] + s[i-2];
		}
		while (t>0) {
			int n = sc.nextInt();
			int dp[] = new int[n+1];
			dp[0] = 1;
			for (int i = 1; i < 16; i++) {
				for (int j = s[i]; j <= n; j++) {
					dp[j] += dp[j-s[i]];
					dp[j] %= 1000000009;
				}
			}
			System.out.println(dp[n]);
			t--;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值