#include <iostream>
#include <list>
using namespace std;
//我们知道人民币有1、2、5、10、20、50、100这几种面值。
//现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
//比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
void print_result(list<int> result)
{
list<int>::const_iterator iter = result.begin();
for(; iter != result.end(); ++iter)
printf("%d ", *iter);
printf("\n");
}
void my_count(int *a, int len, int index, int max_time, int money, int &num, list<int> result)
{
if(money == 0)
{
print_result(result);
num++;
return;
}
else if(money < 0 || result.size() > max_time)
{
return;
}
for(int i=index; i<len; i++)
{
result.push_back(a[i]);
my_count(a, len, i, max_time, money-a[i], num, result);
result.pop_back();
}
}
int count(int *a, int len, int max_time, int money)
{
list<int> result;
int num = 0;
int index = 0;
my_count(a, len, index, max_time, money, num, result);
return num;
}
int main()
{
int a[7] = {1, 2, 5, 10, 20, 50, 100};
int money = 250;
int max_time = 10;
printf("%d has %d methods\n", money, count(a, 7, max_time, money));
return 0;
}
这个题目在论坛上那个看说可以用动态规划法,但是一直也没搞明白怎么用,如果用递归的话效率是很低的。还有,如果只要找出组合的方法,就不用result记录了,用个数组result[7],在入栈前把相应入栈的元素加1就好了。