公司购物

来源:互联网 发布:淘宝闲鱼违规怎么处理 编辑:程序博客网 时间:2024/05/17 02:48

1、问题描述

公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。

程序输入:

第一行是一个整数m,代表可购买的商品的种类数。

接下来是m个整数,每个1行,分别代表这m种商品的单价。

程序输出:

       第一行是一个整数,表示共有多少种方案

       第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。

例如:

       输入:

2

200

300

则应输出:

2

2  2

5  0

       输入:

2

500

800

则应输出:

1

2  0


2、代码

/*++++++++++++++++++++++++++++++++公司购物++author:zhouyong2013-5-2 14:01+++++++++++++++++++++++++++++++++++++*/#include <stdio.h>#include <string.h>int v[10];int b[10];//每次查找到满足条件的暂存结果int bc[10][10];//保存最终结果int c;//记录结果数void f(int cur,int m,int n);int main(){int m,i,j;scanf("%d",&m);for(i=0;i<m;i++){scanf("%d",v+i);}f(0,m,1000);printf("%d\n",c);for(i=0;i<c;i++){for(j=0;j<m;j++)printf("%d ",bc[i][j]);printf("\n");}return 0;}void f(int cur,int m,int n){if(cur>=m){if (n==0){memcpy(bc[c++],b,sizeof(b));}}else{f(cur+1,m,n);//不包括v[cur]的情况if(n>=v[cur]){b[cur]++;f(cur,m,n-v[cur]);//包含v[cur]的情况b[cur]--;//不包含v[cur]的情况,递归返回恢复b[cur]的之前的情况。}}}