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 种购买方案:
- 买 4个 第一种商品
- 买 2个 第一种商品 和 1个 第二种商品
- 买 2个 第二种商品
- 买 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<iostream>
#include<string.h>
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<<dp[x]%mod<<endl;
}
}