第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem J. icebound 的商店-题解

本文主要是介绍第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem J. icebound 的商店-题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

Problem A. Mex Query
Problem B. Nim Game
Problem C. icebound 的账单
Problem G. 520
Problem H. 神殿
Problem J. icebound 的商店
Problem K. Bitmap
       哈希讲解
       二维哈希讲解
Problem L. 跑图





Problem J. icebound 的商店

Time Limit: 1000ms
Memory Limit: 65536KB

Description

icebound在得到神殿的宝藏之后,开了一家神秘的商店。你来到了商店,发现慷慨的icebound搞了 T T T次促销活动。在每次促销活动中,icebound都会想出一个他喜欢的数字,如果你买的商品的总价刚好等于icebound喜欢的数字,那么你就可以免费得到这些商品。

icebound的商店里一共有 15 15 15 件商品,商品的价格和这家商店一样神秘,第一件商品的价格是 1 1 1 元,第二件商品的价格是 2 2 2 元,设第 n n n件商品的价格为 w n w_n wn元,则:

w n = w n − 1 + w n − 2 ( 3 ≤ n ≤ 15 ) w_n = w_{n-1} + w_{n-2} (3 \leq n \leq 15) wn=wn1+wn2(3n15)

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

  1. 买 4个 第一种商品
  2. 买 2个 第一种商品 和 1个 第二种商品
  3. 买 2个 第二种商品
  4. 买 1个 第一种商品 和 1个 第三种商品

请你算出共有多少种方案可以免费购物,方案数对 1000000009 ( = 1 0 9 + 9 ) 1000000009(=10^9+9) 1000000009(=109+9)取模。

Input

第一行给出一个整数 T T T,表示icebound搞了 T T T次活动。

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

1 ≤ T ≤ 3000 1 \leq T \leq 3000 1T3000

1 ≤ x ≤ 3000 1 \leq x \leq 3000 1x3000

Output

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

i i i行的正整数表示在第ii次活动中免费购物的方案数,方案数对 1000000009 ( = 1 0 9 + 9 ) 1000000009(=10^9+9) 1000000009(=109+9)取模。

Sample Input

3
5
20
30

Sample Output

6
134
509

题目大意

icebound的商店共有 15 15 15种商品,每种商品有无限多个。
其中前两件商品的价格分别是 1 1 1 2 2 2,从第 3 3 3件商品开始,每件商品的价格为前两件商品的和。
每次给你一个数 n n n,问你有多少种选法,使得商品总价格为 n n n


解题思路

这是一道完全背包题。简单说一下:
我们可以用 d p [ j ] dp[j] dp[j]来表示总价为 j j j的选择方案。那么在选择第 i i i件商品时,我们有: d p [ j ] = d p [ j ] + d p [ j − f b n q [ i ] ] dp[j]=dp[j]+dp[j-fbnq[i]] dp[j]=dp[j]+dp[jfbnq[i]](其中 f b n q [ i ] fbnq[i] fbnq[i]代表第 i i i件商品的价格)。
即:如果不选这第 i i i件商品,方案数还是原来的方案数 d p [ j ] dp[j] dp[j];如果选择这第 i i i件商品,方案数就是价格为 j − 第 i 件 商 品 的 价 格 j-第i件商品的价格 ji的方案数,即 d p [ j − f b n q [ i ] ] dp[j-fbnq[i]] dp[jfbnq[i]]
初始值 d p [ 0 ] = 1 dp[0]=1 dp[0]=1,购买总价为 0 0 0的商品的方案只有一种:啥都不买

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int dp[3010]={0};
ll fbnq[16];
ll mod=1000000009;
int main()
{fbnq[1]=1,fbnq[2]=2;for(int i=3;i<=15;i++)fbnq[i]=fbnq[i-1]+fbnq[i-2];dp[0]=1;for(int i=1;i<=15;i++)for(int j=fbnq[i];j<=3005;j++)dp[j]+=dp[j-fbnq[i]],dp[j]%=mod;int n;cin>>n;while(n--){int t;cin>>t;cout<<dp[t]<<endl;}return 0;
}

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/116536351

这篇关于第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem J. icebound 的商店-题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893904

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析