首页 > 代码库 > 每日编程-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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。