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

    xiaoxiao2021-03-25  74

    公司发了某商店的购物券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; }
    转载请注明原文地址: https://ju.6miu.com/read-36328.html

    最新回复(0)