加勒比海盗船

一群海盗截获了一艘装满各种金银珠宝和古董的货船,每一件宝物都价值连城一旦打碎就失去了价值。海盗船的载重量为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;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容