小白日记之贪心算法的应用

博主在紧张的时间中尝试解决背包问题和最优装载问题,发现自己在基础概念如结构体、指针、STL和贪心算法上的不足。最优装载问题采用贪心策略,按集装箱重量从小到大装运,直至超过轮船载重量。尽管面临挑战,博主决心继续深入学习。
摘要由CSDN通过智能技术生成

这几天着急忙慌的做了一些题(老费把时间卡的很紧),总觉得自己掌握的知识和这几天题目要求的差距太大,简直是一个地下,一个天上有木,这种感觉就像一个小学生去做高中生的数学题一样,所有的东西都是新的,都需要自己去从头学起。最近新学知识的课件也有很多完全陌生的东西,这些知识有些是互通的,我想一旦我明白了基础的东西,再从基础的东西向上扩展应该就不难了了吧,我现在最大的困难是对一些基本知识还没有概念,比如说结构体、指针、stl、贪心算法、当然也没怎么具体实践过,我学东西的速度很慢。不管多难,我会一直学下去,即便被老费t了,至少我是真真切切的学到东西了,就算参加不了比赛,我也知足了。加油加油

背包问题

现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大
#include<stdio.h>  
#include<stdlib.h>  
typedef struct  
{  
    int val;//单位价值  
    int weight;  
}PRO;  
int comp(const void *a,const void *b)  
{  
    return ((PRO*)b)->val-((PRO*)a)->val;  
}  
int main()  
{  
    PRO a[10];  
    int i=0;  
    int m,n;  
    int val_sum=0;  
    int weight_sum=0;  
    printf("输入物品种类数目:\n");  
    scanf("%d",&n);  
    printf("依次输入重量和价值:\n");  
    for(i=0;i<n;i++)  
    {  
        scanf("%d %d",&a[i].weight,&a[i].val);  
    }  
    printf("输入重量的限制:\n");  
    scanf("%d",&m);  
    qsort(a,n,sizeof(PRO),comp);  
    for(i=0;i<n&&(weight_sum<15);i++)  
    {  
        weight_sum+=a[i].weight;  
        val_sum+=a[i].weight*a[i].val;  
    }  
    if(weight_sum>m)  
    {  
        val_sum-=(weight_sum-m)*a[i-1].val;  
    }  
    printf("%d",val_sum);  
}  

最优装载问题

有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

思路:根据贪心算法的思想,这里应该是每次先选择小的先装上,一直到超过限制就停止,最后输出编号就行了。


#include<stdio.h>  
#include<stdlib.h>  
typedef struct//定义集装箱结构体  
{  
    int weight;  
    int num;  
}W;  
int comp(const void*a,const void *b)  
{  
    return ((W*)a)->weight-((W*)b)->weight;  
}  
int main()  
{  
    W a[10];  
    int i,j=0;  
    int n=0;  
    int m;  
    int sum=0;  
    printf("请输入集装箱的个数:\n");//方便测试不超过10  
    scanf("%d",&m);  
    printf("输入重量的最大限制:\n");  
    scanf("%d",&n);  
    printf("请输入每个集装箱的重量");  
    for(i=0;i<m;i++)  
    {  
        scanf("%d",&a[i].weight);  
        a[i].num=i+1;  
    }  
    qsort(a,m,sizeof(W),comp);//先排序  
    for(i=0;i<m;i++)//然后从小到大加起来  
    {  
        if(sum<=n)  
        sum+=a[i].weight;  
        else  
        {  
            j=i;  
            break;//记录最后的值  
        }  
    }  
    for(i=0;i<j;i++)  
    {  
        printf("第%d号: %d\n",a[i].num,a[i].weight);  
    }  
    return 0;  
}  
闲话就不多说了,小白还有太多的东西要学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值