第二节蓝桥杯第九题 程序设计(满分16分)

公司发了某商店的购物券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<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[n]++;//选该物品  
    money+=p[n];  
    buy(n);//可以继续选该物品  
    num[n]--;//不选该物品,前面加的要减去  
    money-=p[n];//钱也相应的减  
    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;  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值