题目:
公司发了某商店的购物券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);//递归核心
}
}