每日编程-20170327
Posted r088r088
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日编程-20170327相关的知识,希望对你有一定的参考价值。
有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。
给定一个int n,请返回n分有几种表示法。
保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。
测试样例:
6
返回:2
解答:
硬币问题直接使用动态规划的算法,我是在这里学习的该方法,有详细的解答。
下面是我按照连接的方法写的动态规划算法。
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 alcCoinNoR(const vector<int> &coins, int sum) { 6 vector<int> tmpV2(sum + 1, 0); 7 vector<vector<int>> dp(coins.size() + 1, tmpV2); 8 for (size_t i = 0; i <= coins.size(); i++) 9 { 10 dp[i][0] = 1; 11 } 12 for (size_t i = 1; i <= coins.size(); i++) 13 { 14 for (size_t j = 1; j <= sum; j++) 15 { 16 for (size_t k = 0; k <= j / coins[i - 1]; k++) 17 { 18 dp[i][j] += dp[i - 1][j - k*coins[i - 1]]; 19 } 20 } 21 } 22 return dp[coins.size()][sum]; 23 } 24 int main() { 25 int n; 26 while (cin >> n) 27 { 28 vector<int> coins = { 1,5,10,25 }; 29 cout << (n < 0 ? (-1) : (calcCoinNoR(coins, n)))% 1000000007 << endl; 30 } 31 }
以上是关于每日编程-20170327的主要内容,如果未能解决你的问题,请参考以下文章