2012创新工场校园招聘的一道编程算法题:有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?
/**
* Coin Permutation
* 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?
* @author arhaiyun
* Date: 2013-09-24
*/
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
int target = 0; //目标coin分数
int curCoins = 0; //当前coin总数
int count = 0;
vector<int> solution; //记录排列解决方案
int coins[] = {1, 2, 5, 10};
void dfsCoinSolution(int index)
{
if(curCoins == target)
{
count++;
vector<int>::iterator iter = solution.begin();
cout<<"["<<count<<"]:";
for(; iter != solution.end(); iter++)
{
cout<<(*iter)<<" ";
}
cout<<endl;
return;
}
if(curCoins > target)
return;
for(int i = index; i < 4; i++)
{
solution.push_back(coins[i]);
curCoins += coins[i];
dfsCoinSolution(i);
curCoins -= coins[i];
solution.pop_back();
}
}
int main(void)
{
while(1)
{
count = 0;
cin>>target;
if(target <= 0)
break;
dfsCoinSolution(0);
}
return 0;
}