icebound的商店 【完全背包 】2018河北省程序设计 J 题

icebound的商店

题目描述:
icebound在得到神殿的宝藏之后,开了一家神秘的商店。你来到了商店,发现慷慨的icebound搞了T TT次促销活动。在每次促销活动中,icebound都会想出一个他喜欢的数字,如果你买的商品的总价刚好等于icebound喜欢的数字,那么你就可以免费得到这些商品。
icebound的商店里一共有 15 件商品,商品的价格和这家商店一样神秘,第一件商品的价格是 1 元,第二件商品的价格是 2元,设第n件商品的价格为wn w_nw
n

元,则:
wn=wn−1+wn−2(3≤n≤15) w_n=w_{n-1}+w _{n−2}(3≤n≤15)w
n

=w
n−1

+w
n−2

(3≤n≤15)
如果在某次活动中icebound喜欢的数字是 4,那么共有 4 种购买方案:

  1. 买 4个 第一种商品
  2. 买 2个 第一种商品 和 1个 第二种商品
  3. 买 2个 第二种商品
  4. 买 1个 第一种商品 和 1个 第三种商品
    1
    2
    3
    4
    请你算出共有多少种方案可以免费购物,方案数对1000000009取模。
    输入:
    第一行给出一个整数T TT,表示icebound搞了T TT次活动。

接下来的T TT行每行给出一个正整数x xx,表示在这次活动中icebound喜欢的数字。

1≤T≤ 1 \leq T \leq1≤T≤ 3000

1≤x≤3000 1 \leq x \leq 30001≤x≤3000

输出:
输出T TT行,每行输出一个正整数。

第i行的正整数表示在第i次活动中免费购物的方案数,方案数对1000000009取模。

解题思路

完全背包
转移方程:dp[j] = dp[j]+dp[j-a[i].w]

代码

#include
#include
using namespace std;
struct node
{
	int p;
	int w;
}a[10005];
int N,t,x;
int dp[10005];
int mod =  1e9+9;
void init()
{
	a[0].w=1;
	a[1].w=1;
	for(int i=2;i<=15;i++)
		a[i].w = a[i-1].w+a[i-2].w;
}
int main()
{
	cin>>t;
	init();
	while(t--)
	{
		cin>>x;
		memset(dp ,0 ,sizeof dp);
		dp[0] = 1;
		for(int i=1;i<=15;i++)
		{
			for(int j=a[i].w;j<=x;j++)
				dp[j] = (dp[j] + dp[j-a[i].w])%mod;
		}
		cout<

你可能感兴趣的:(河北省程序设计,OJ,蓝桥杯,天梯赛)