首页 > 代码库 > 每日编程-20170327

每日编程-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