第二届蓝桥杯C/C++组第九题 购物(递归)
2016-02-05 17:30
260 查看
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
递归思路,具体见代码注解。
#include<stdio.h>
#include<string.h>
int m;//物品数
int p[100];//价格
int ans[100][100];//ans[i][j]表示第i个方案中第j个物品被选数
int num[100];//num[i]表示第i件物品被选的个数
int cas=0;//方案数
int money=0;//花的钱
void buy(int n)//n表示当前搜索到的物品编号
{
if(money>1000||n>=m)//当花的钱超过预算或者所有的物品都已遍历过了,不再继续搜索下去
return ;
if(money==1000)//当花的钱正好为1000,满足要求
{
for(int i=0; i<m; i++)
ans[cas][i]=num[i];
cas++;
return ;
}
num
++;//选该物品
money+=p
;
buy(n);//可以继续选该物品
num
--;//不选该物品,前面加的要减去
money-=p
;//钱也相应的减
buy(n+1);//选下一个物品
}
int main()
{
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d",&p[i]);
memset(num,0,sizeof(num));
buy(0);
printf("%d\n",cas);
for(int i=0; i<cas; i++)
{
for(int j=0; j<m; j++)
printf("%d ",ans[i][j]);
printf("\n");
}
return 0;
}
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
递归思路,具体见代码注解。
#include<stdio.h>
#include<string.h>
int m;//物品数
int p[100];//价格
int ans[100][100];//ans[i][j]表示第i个方案中第j个物品被选数
int num[100];//num[i]表示第i件物品被选的个数
int cas=0;//方案数
int money=0;//花的钱
void buy(int n)//n表示当前搜索到的物品编号
{
if(money>1000||n>=m)//当花的钱超过预算或者所有的物品都已遍历过了,不再继续搜索下去
return ;
if(money==1000)//当花的钱正好为1000,满足要求
{
for(int i=0; i<m; i++)
ans[cas][i]=num[i];
cas++;
return ;
}
num
++;//选该物品
money+=p
;
buy(n);//可以继续选该物品
num
--;//不选该物品,前面加的要减去
money-=p
;//钱也相应的减
buy(n+1);//选下一个物品
}
int main()
{
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d",&p[i]);
memset(num,0,sizeof(num));
buy(0);
printf("%d\n",cas);
for(int i=0; i<cas; i++)
{
for(int j=0; j<m; j++)
printf("%d ",ans[i][j]);
printf("\n");
}
return 0;
}
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析