dp——完全背包(方案数)

Problem J. icebound 的商店
Time limit: 1000ms
Memory limit: 65536KB
Description
icebound 在得到神殿的宝藏之后,开了一家神秘的商店。你来到了商店,发现慷慨的
icebound 搞了𝑇𝑇次促销活动。在每次促销活动中,icebound 都会想出一个他喜欢的数字,如
果你买的商品的总价刚好等于 icebound 喜欢的数字,那么你就可以免费得到这些商品。
icebound 的商店里一共有 15 件商品,商品的价格和这家商店一样神秘,第一件商品的
价格是 1 元,第二件商品的价格是 2 元,设第𝑛𝑛件商品的价格为𝑤𝑤 𝑛𝑛 元,则:
𝑤𝑤 𝑛𝑛 = 𝑤𝑤 𝑛𝑛−1 + 𝑤𝑤 𝑛𝑛−2 (3 ≤ 𝑛𝑛 ≤ 15)
如果在某次活动中 icebound 喜欢的数字是 4,那么共有 4 种购买方案 :
1. 买 4 个 第一种商品
2. 买 2 个 第一种商品 和 1 个 第二种商品
3. 买 2 个 第二种商品
4. 买 1 个 第一种商品 和 1 个 第三种商品
请你算出共有多少种方案可以免费购物,方案数对1000000009(= 10 9 + 9)取模。
第 2 届河北省大学生程序设计竞赛试题册
17
Input
第一行给出一个整数𝑇𝑇,表示 icebound 搞了𝑇𝑇次活动。
接下来的𝑇𝑇行每行给出一个正整数𝑥𝑥,表示在这次活动中 icebound 喜欢的数字。
1 ≤ 𝑇𝑇 ≤ 3000 , 1 ≤ 𝑥𝑥 ≤ 3000
Output
输出𝑇𝑇行,每行输出一个正整数。
第𝑖𝑖行的正整数表示在第𝑖𝑖次活动中免费购物的方案数,方案数对1000000009(= 10 9 + 9)
取模。

完全背包输出方案数

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 using namespace std;
13 const double Pi=3.14159265358979323846;
14 typedef long long ll;
15 const int MAXN=5000+5;
16 const int dx[5]={0,0,0,1,-1};
17 const int dy[5]={1,-1,0,0,0};
18 const int INF = 0x3f3f3f3f;
19 const int NINF = 0xc0c0c0c0;
20 const ll mod=1e9+9;
21 int dp[MAXN];
22 int a[20];
23 int fibo(int v)
24 {
25     if(a[v]!=0) return a[v];
26     if(v<=2)
27     {
28         a[v]=v;
29         return a[v];
30     }
31     else a[v]=fibo(v-1)+fibo(v-2);
32     return a[v];
33  } 
34 
35 int main()
36 {
37     fibo(15);
38     
39     for(int i=0;i<=3000;i++)
40     {
41         dp[i]=1;
42     }
43     for(int i=2;i<=15;i++)
44     {
45         for(int j=a[i];j<=3000;j++)
46         {
47             dp[j]+=dp[j-a[i]];
48             dp[j]%=mod;
49         }
50     }
51     int t;cin>>t;
52     while(t--)
53     {
54         int m;cin>>m;
55         cout <<dp[m]<<endl;
56     }
57     return 0;
58     
59 }

 

posted @ 2019-03-23 22:13  Chuhanjing  阅读(336)  评论(0编辑  收藏  举报