兑换零钱

来源:互联网 发布:深圳找工作知乎 编辑:程序博客网 时间:2024/03/28 23:30
#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就好了。
 

原创粉丝点击