国信蓝点杯决赛训练试题1
1 问题描述
给定整数集合S和两个整数m,n,是否存在S的一个子集H,使得m是取自H中至多n个整数的和(可以重复取)。
输入
从输入文件读入若干组测试数据。每一组测试数据的第一行是三个整数m,n,k,(0≤m≤10000,0≤n≤20,0≤k≤20)。接着的一行上有k个整数b1,b2,…,bk,表示S由这k个整数组成。
输入直到文件结束。
输出
对第i组测试数据,你应先在一行上输出文字“Case #:”,其中“#”是测试数据编号i(从1开始编),再在下一行上输出你能否实现将m表示成S中至多n个数字的和的文字描述:“可能”,并将所有的组合形式输出出来。否则输出“不可能”
输入样例 输出样例
10 3 3 Case 1:
4 1 2 可能
10=4+4+2
27 5 3 Case 2:
2 3 13 不可能
2 碎纸机游戏设计:
你现在负责设计一种碎纸机,使其具有以下特点:
① 每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数;
② 碎纸机切出的每个纸片上都包括一个数;
③ 要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。 例如,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸片切成4块,分别包含1,2,34和6。这样,这些数的和是43=1+2+34+6,这是所有的分割方式中,不超过50而又最接近50的分割方式。又比如,分割成1,23,4和6是不正确的,因为这样的总和是34=1+23+4+6,比刚才得到的结果43小。分割成12,34和6也是不正确的,因为这时的总和是52=12+34+6,超过了50。
还有以下3个特别的规则:
① 如果目标数和输入纸片上的数相同,那么纸片不进行切割;
② 如果不论怎样切割,分割得到的纸片上数的和都大于目标数,则显示错误信息;
③ 如果有多种不同的切割方式可以得到相同的最优结果,则应显示出最优结果的全部获得方式。
为了设计这样的一个碎纸机,要求你编写一个简单的模拟程序来模拟以上碎纸过程。给定两个数,第一个是目标数,第二个是输入纸片上的数,你需要给出碎纸机对纸片的分割方式。