一群海盗截获了一艘装满各种金银珠宝和古董的货船,每一件宝物都价值连城一旦打碎就失去了价值。海盗船的载重量为C,每件宝物的重量为Wi,海盗们应该如何把尽可能多的宝物装上船?
根据算法设计分析,我们用一维数组
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N=100005;
double w[N];
int main(){
double c=0;//载入重量C
int n=0;//古董个数n
printf("请输入船只的载重量C,和古董数量N:");
scanf("%d %d",&c,&n);
printf("请输入每个古董的重量");
for(int i = 0; i < n; i++){
scanf("%d",&w[i]);
}
sort(w,w+n);//按照古董重量升序排列
double tmp=0;//tmp为已装载的古董重量
int ans=0; //ans为已经装上的古董个数
for(int i=0;i<n;i++){
tmp += w[i];
if(tmp<=c){
ans++;
}
else{
break;
}
}
printf("能装进去的古董最大数目为%d",ans);
return 0;
}
算法复杂度分析:
时间复杂度:按照重量排序,调用sort函数,其平均时间复杂度为O(nlogn),输入和贪心策略求解的两个for语句时间复杂度均为O(n),所以时间复杂度为O(n+nlog(n))
空间复杂度:程序中变量tmp,ans等占用了一些辅助空间,这些辅助空间都是常熟阶的,因此空间复杂度为O(1)。
for(int i=0;i<n;i++){
tmp += w[i];
if(tmp>=c){
if(tmp==c)
ans = i +1;
else
ans =1;
break;
}
}