题:http://xyoj.xynu.edu.cn/problem.php?id=1246
经典的贪心算法,因为最后一块有锯子可以截,所以比较简单。
宽度一定了,所以只看长度就行。 要木板数量最少,当然从最长的木板开始选起。当加上某一块木板后长度大于或者正好等于缝长,就得到我们要需要的最小数量。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int a,int b){
return a>b;
}
int main(){
int num[601];
int L,n,i,j; //L 缝长 (宽度题给已定)
while(scanf("%d%d",&L,&n)!=EOF){
int sum =0;
for(i = 0;i<n;i++){ //在输入木板长度的时候,记录木板总长
cin>>num[i];
sum+=num[i];
}
if(sum<L) cout<<"impossible"<<endl; //如果木板总长小于缝长则凉凉
sort(num,num+n,cmp); //对所有木板从大到小排序
sum = 0; //这里初始化为0,用来记录木板数量
for( i =0;i<n;i++){ //从大到小遍历每一块木板
if(L-num[i]>0){ //如果剩余长度 - 当前最长木板还有剩余
sum++; //数量加上这块
L-=num[i]; //剩余长度更新
} else{ //如果剩余长度小于或着等于当前最长木板
sum++; //等于正好,小于可锯
cout<<sum<<endl; //输出数量
break; //结束
}
}
}
}