美团2017校招-拼凑钱币

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zlb872551601/article/details/77686559
[编程题] 拼凑钱币

时间限制:1秒

空间限制:32768K

给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。 
输入描述:
输入包括一个整数n(1 ≤ n ≤ 10000)


输出描述:
输出一个整数,表示不同的组合方案数

输入例子1:
1

输出例子1:
1
 
   
很经典的题目,dp[type][money]=dp[type][money-jine[type]]+dp[type-1][money](要求money-jine[type]》=0才行)
否则是dp[type][money]=dp[type-1][money]
 
   
dp[type][money-jine[type]]表示如果出一张jine[type]的钱的情况,dp[type-1][money]表示连一张jine[type]的钱都不出的情况,另外出多于一张jine[type]的钱的情况,可以由dp[type][money-jine[type]]再去解决。
#include <iostream>


using namespace std;


#include <vector>


using namespace std;


vector<vector<long long >>dp(6, vector<long long>(10002, 1));
long long  money_type[6] = { 1, 5, 10, 20, 50, 100 };
long long  solve(int n)
{
for (int i = 1; i < 6;i++)
{
for (int j = 0; j <= n;j++)
{
if (j - money_type[i] >= 0)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - money_type[i]];
}
else
{
dp[i][j] = dp[i - 1][j];
}

}
}
return dp[5][n];
}
int main()
{
/*vector<int> money_type_v;
for (int i = 0; i < 6;i++)
{
money_type_v.push_back(money_type[i]);
}*/
int n;
while (cin>>n)
{
long long  res = solve(n);
cout << res << endl;
//return 0;
}
return 0;
}
这个题恶心的地方是用int的只能通过30%,用 long long 一下子就100%了。

猜你喜欢

转载自blog.csdn.net/zlb872551601/article/details/77686559