最优装载问题
题目描述
有一批集装箱要装上一艘载重量为 c 的轮船,其中集装箱 i 的重量为w[i]。 求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
输入描述
输入有两行,
第一行有两个正整数,表示轮船的载重量 c 和集装箱的数量 n。
第二行有n个整数w1,w2......wn表示n个集装箱的重量。 整数之间用一个空格隔开。
1 <= n <= 100, 1 <= w[i] <= 100
输出描述
输出两行,
第一行输出一个整数,表示最多能装载的集装箱数。
第二行输出所装载的集装箱编号,按从小到大排列。
如果有两个同样重量的集装箱,则装载编号小的一个。 如果一个集装箱也装不进去,就输出 “No answer!”。
输入样例#1
50 3
40 10 40
输出样例#1
2
1 2
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int find_min(int w[],bool find[],int len){
int min=10000,pos=-1;
for (int i=0;i<len;i++){
if (w[i]<min && find[i]==false){
pos=i;
min=w[i];
}
}
find[pos]=true;
return pos;
}
bool cmp(int x,int y){
if (x>=y)
return true;
else
return false;
}
int main(int argc,char *args[]){
int c,n,count=0;
cin>>c;
cin>>n;
int w[n]={0},ans[n]={-1};
bool find[n]={false};
for (int i=0;i<n;i++){
cin>>w[i];
}
/*
cout<<find_min(w,find,n)<<endl;
cout<<find_min(w,find,n);
*/
while (c>0){
int i=find_min(w,find,n);
if ((c-w[i])>=0){
ans[count]=i;
count++;
c-=w[i];
}
else
break;
}
sort(ans,ans+count,cmp);
for (int i=0;i<count;i++){
cout<<ans[i]+1<<" ";
}
}