题目描述
洞的形状是1*1*L(米)的长方体。从邻居那借来N块木块和一个锯子。正好木块的形状也是矩形,宽度和高度都是1米。
借助这些工具,可以通过锯掉木块的多余部分来补好墙壁,当然,也能不锯掉。
现在,知道了每块木块的规格,怎样补好墙壁而且用的木块数最少呢?
输入
包含多组测试用例,以"0"为结尾标志。
每组数据含两行,第一行有两个整数L(0 < L < 10^5)和N(0< = N < =1000). 第二行有N个正整数,第i个整数a[i]代表第i块木块的规格为1*1*a[i](米).
输出
对每个测试用例,输出一个代表最少需要木块数的整数。 如果不能用已有的木块修补好墙壁,输出"impossible"。
样例输入
5 3
3 2 1
5 2
2 1
0
样例输出
2
impossible
【思路】将给定木板排序,从大的开始匹配.
#include<stdio.h>
int main(void)
{
int n,m;
int arr[1000];
while(1){
scanf("%d",&n);
if(n==0)break;
else{
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&arr[i]);
}
//冒泡排序
for(int i = 0 ;i<m-1;i++){
for(int j = 0 ;j<m-i-1;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
int i;
int sum=0;
for(i=m-1;i>=0;i--){
sum=sum+arr[i];
if(sum>=n){
break;
}
}
if(i<0){
printf("impossible\n");
}
else{
int res=m-i;
printf("%d\n",res);
}
}
}
return 0;
}