草船借箭
题目:- 题目描述:
- 程序员小周同学这几天在看《三国演义》。今天他看到了“草船借箭”这一回,在钦佩诸葛亮巧借东风向曹操“借"箭的同
- 时,小周想到这么一个问题: 如果诸葛亮一共派出了N条放置草人的船来“借"箭。“悚慨”的曹操向第1条草船上射了A支
- 箭、第2条草船上射了B支箭,第3条草船上射的箭的数量等于前面两条船上箭的数量之和多一支,第4条草船上射的箭的
- 数量等于前面三条船上的箭的数量之和多一支,...,以此类推,第N条草船上箭的数量等于前面N-1条船上箭的数量之和
- 多一支。 下面问题来了,请问这一次诸葛亮一共从曹操那里“借”了多少支箭呢?
- 输入描述
- 输入三个正整数N、A和B,三个正整数都不超过1000,并且保证N>1,且两两之间用空格隔开。
- 输出描述
- 输出诸葛亮“借”箭的总数量。结果对1e9+7取模。
- 样例输入
- 4 1 2
- 样例输出
- 15
复制代码 思路:
a.当天箭头的数量是前面箭头数量和+1,由 preSum保存
如果写过斐波拉切数列那么本题思路就会比较明确。
[code]#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int main() { long long mod = 1e9 + 7; int n = -1; cin >> n; vector nums(n,0); cin >> nums[0] >> nums[1]; long long preSum = nums[0] + nums[1]; for (int i = 2; i < n; ++i) { nums = (preSum + 1)%mod; preSum += nums; preSum %= mod; } long long res = 0; for (int i = 0; i < nums.size(); ++i) { res += nums; res %= mod; } cout > m; vector dp(n + 1, vector(m+10, INT_MAX/2));//dp[j]表示考虑前i个数字,组合为j的最小的数字个数 for (int i = 0; i < n + 1; ++i) { dp[0] = 0;//任何组合组成0 需要的个数是0个 } vector numsVt; for (int i = 0; i < n; ++i) { int t = -1; cin >> t; numsVt.push_back(t); } for (int i = 1; i m) { continue; } dp[thisNum] = 1; //特殊赋值 for (int j = 0; j = thisNum) { dp[j] = min({dp[j],dp[i - 1][j - thisNum] + 1 }); } } } if (dp[n][m] == INT_MAX / 2) { cout |