1000元购物券 (分治递归)
题目:
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
第一个商品买多少,还剩多少钱,对于第二个可以类似处理。简单的递归!2011年蓝点杯预赛题,当时不会做,惭愧。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int price[100],tmp[100]; int ans[100][100]; int s;//一共多少种 int tnum; void fun(int a[],int sum,int n); int main() { int num,i,j; scanf("%d",&num); tnum = num; for(i = 0 ; i < num ; ++i) scanf("%d",&price[i]); memset(ans,0,sizeof(ans)); s = 0; fun(price,1000,num); printf("%d\n",s); for(i = 0 ; i < s ; ++i) { for(j = 0 ; j < num ; ++j) printf("%d ",ans[i][j]); printf("\n"); } system("pause"); return 0; } void fun(int a[],int sum,int n)//从后往前 { int i,j,k; if(0 == n) //每个商品看完了 { if(0 == sum)//钱正好用完 { for(j = 0 ;j < tnum; ++j) ans[s][j] = tmp[j]; ++s; } return; } k = sum/a[n-1];//最多能买几个第 n 个商品 for(i = k ; i >= 0 ; --i) { tmp[n-1] = i; fun(a,sum - i*price[n-1],n-1);//递归核心 } }