找零钱以及整数分解成正整数和式组合
2013-08-04 12:33
148 查看
java 代码:利用递归打印所有组合以及总数,修改nextChange()函数即可求解这两个问题
c代码:利用动态规划打印总数
int changes[]={1,2,5}; Map<Integer,Integer> print = new HashMap<Integer,Integer>(); int nextChange(int change){ int nextChange=0; switch(change){ case 10: nextChange= 5; break; case 5: nextChange= 2; break; case 2: nextChange= 1; break; } return nextChange; } int makeChange(int n, int change,HashMap<Integer,Integer> print){ int way=0,i; if(change==1){ print.put(1, n); printAll(print); return 1; } for(i=0;i*change<=n;i++){ print.put(change, i); way+=makeChange(n-i*change,nextChange(change),print); } return way; } public void printAll(HashMap<Integer,Integer> map){ Iterator iter = map.entrySet().iterator(); StringBuffer sb = new StringBuffer(); while(iter.hasNext()){ Map.Entry entry = (Map.Entry) iter.next(); Integer key = (Integer) entry.getKey(); Integer val = (Integer) entry.getValue(); for(int i=0;i<val;i++){ sb.append(key+" "); } } System.out.println(sb); }
c代码:利用动态规划打印总数
#include <stdlib.h> #define N 10000 int a ; int change[3]={1,2,5}; int makeChange(int n, int changeCount){ a[0]=1; int i,j; for(i=0;i<changeCount;i++){ for(j=change[i]; j<= n; j++){ a[j]=a[j]+a[j-change[i]]; } } return a ; } int main(){ printf("%d",makeChange(100,3)); getchar(); }
相关文章推荐
- USTC机试-将正整数分解成尽可能多的连续整数之和
- 一个整数分解为连续正整数之和
- 正整数分解为n个连续正整数
- 求正整数n所有可能的和式的组合
- 一个正整数分解为几个连续的正整数之和
- 求正整数n所有可能的和式的组合
- 将任意一个正整数n整数的立方分解为连续n个奇数之和
- 整数分解为指定元素的加法表示:找零钱
- 学习笔记:素数的判定以及整数的唯一分解定理
- 求正整数n所有可能的和式的组合
- 组合数学+整数分解 POJ 2992 Divisors
- 求正整数n所有可能的和式的组合
- 求正整数n所有可能的和式的组合
- 给定一个数t,以及n个整数,在这n个数中找到和为t的所有组合
- 求正整数 n 所有可能的和式的组合
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 将一个正整数分解为多个连续整数之和
- 求正整数n所有可能的和式的组合
- 经典题:一个整数分解为连续正整数之和
- 将一个正整数分解为一系列不重复的整数的和