2011 蓝桥杯【初赛试题】 程序设计题二

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

程序输入:

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

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

程序输出:

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

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

例如:

输入:

2

200

300

则应输出:

2

2 2

5 0

输入:

2

500

800

则应输出:

1

2 0

 

 

#include<stdio.h>
#include<string.h>
int cost;
int n;//物品个数
int price[2000];//物品单价
int num[100];//物品数目
int sum=0;//方案数目
int arg[100][100];//每种方案的商品分布
void Fun(int x)//递归,每件物品分为买或者不买的情况(同一物品可以买多次)
{
    int i;
    if(cost>1000||x>=n)
    return;
    if(cost==1000)
    {
       for(i=0; i<n; i++)
         arg[sum][i] = num[i];
         sum++;
         return;

    }
    num[x]++;//选择这件商品的情况
    cost+=price[x];
    Fun(x);//还可能继续选这件商品
    num[x]--;//不选择这件商品的情况
    cost-=price[x];
    Fun(x+1);//往下走
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&price[i]);
    memset(num,0,sizeof(num));//数组清0为了之后的加减运算
    Fun(0);
    printf("%d\n",sum);
    for(i=0;i<sum;i++)
    {
       printf("%d",arg[i][0]);//防止多输出空格
       for(j=1;j<n;j++)
       printf(" %d",arg[i][j]);
       puts("");
    }

    return 0;
}

参考:http://www.cnblogs.com/hxsyl/archive/2012/12/15/2819911.html 

时间: 2024-10-29 23:23:27

2011 蓝桥杯【初赛试题】 程序设计题二的相关文章

蓝桥杯 历届试题 公式求值 (想了很久了,想不明白,才来请教的,麻烦各位了)

问题描述 蓝桥杯 历届试题 公式求值 (想了很久了,想不明白,才来请教的,麻烦各位了) 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 3 1 3 样例输出 162 样例输入 20 10 10 样例输出 359316 数据

蓝桥杯 历届试题 大臣的旅费

历届试题 大臣的旅费   时间限制:1.0s   内存限制:256.0MB        问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达.同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的. J是T国重要大臣,他巡查于各大城市之间,体察民情.所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情.

2011蓝桥杯【初赛试题】程序设计题三

一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下: 1.首先按行填入密钥串. 2.紧接其后,按字母序按行填入不在密钥串中的字母. 3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换. 如果密钥为youandme,则该方阵如下: y o u a n d m e b c f g h i j k l p q r s t v w x 在加密一对字母时,如am,在方阵中找到

2011蓝桥杯【初赛试题】程序设计题一

方阵的主对角线之上称为"上三角". 请你设计一个用于填充n阶方阵的上三角区域的程序.填充的规则是:使用1,2,3-.的自然数列,从左上角开始,按照顺时针方向螺旋填充. 例如:当n=3时,输出: 1 2 3 6 4 5 当n=4时,输出: 1 2 3 4 9 10 5 8 6 7 当n=5时,输出: 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 程序运行时,要求用户输入整数n(3~20) 程序输出:方阵的上三角部分. 要求格式:每个数据宽度为4,右对齐.   #

2011蓝桥杯【初赛试题】中奖计算

中奖计算 某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码.最后通过摇奖的办法随机产生一个8位数字.参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号. 例如:小张写的数字是:12345678,而开奖号码是:42347856.则称小张中了3个号,因为其中最长的相同连续位是:"234".如果小张写的是:87654321,则他只中了一个号. 下面的代码根据传入的参数,返回中了几个号.其中:a表示被评价的号码,b表示摇号产生的数字.请填写缺少的代码. int g

2011蓝桥杯【初赛试题】神秘的三位数

神秘的三位数 有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身.即:abc = a! + b! + c! 下面的程序用于搜索这样的3位数.请补全缺失的代码. int JC[] = {1,1,2,6,24,120,720,5040,40320,362880}; //开了一个JC的数组用来存取1至9的阶乘,省去了下面的运算,节省了时间 int i; for(i=100; i<1000; i++) { int sum = 0; int x = i; while(x!=0)//补全的代码(把x的

2011蓝桥杯【初赛试题】n进制小数

n进制小数 将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出.例如:若十进制小数为0.795,则输出: 十进制正小数0.795000转换成 2进制数为: 0.11001011 十进制正小数0.795000转换成 3进制数为: 0.21011011 十进制正小数0.795000转换成 4进制数为: 0.30232011 十进制正小数0.795000转换成 5进制数为: 0.34414141 十进制正小数0.795000转换成 6进制数为: 0.4434

2011蓝桥杯【初赛试题】歌赛新规则

歌赛新规则 歌手大赛的评分规则一般是去掉一个最高分,去掉一个最低分,剩下的分数求平均.当评委较少的时候,如果我们只允许去掉一个分数,该如何设计规则呢? 有人提出:应该去掉与其余的分数平均值相差最远的那个分数.即"最离群"的分数. 以下的程序用于实现这个功能.其中x存放所有评分,n表示数组中元素的个数.函数返回最"离群"的那个分数值.请补全缺失的代码. double score(double x[], int n) { int i,j; double dif = -1

2011 蓝桥杯【初赛试题】反转串

反转串 我们把"cba"称为"abc"的反转串. 下面的代码可以把buf中的字符反转.其中n表示buf中待反转的串的长度.请补充缺少的代码. void reverse_str(char* buf, int n) { if(n<2) return; char tmp = buf[0]; buf[0] = buf[n-1]; buf[n-1] = tmp; return reverse_str(buf+1, int n-2); //递归,reverse_str每一