4.1贪心算法:一般背包问题、活动安排问题

一般背包问题:

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct A{
    float v,w,avg,x;
    int seq;
}pack[103];

void sort_pack(A pack[],int n){
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(pack[j].avg>pack[i].avg){
                swap(pack[i].avg,pack[j].avg);
                swap(pack[i].v,pack[j].v);
                swap(pack[i].w,pack[j].w);
                swap(pack[i].seq,pack[j].seq);
            }
        }
    }
}


int main(){
    int n;
    float M;

    printf("请输入背包个数和背包总重量:\n");
    scanf("%d%f",&n,&M);
    printf("请输入每个背包的价值和重量:\n");
    for(int i=0;i<n;i++){
        scanf("%f%f",&pack[i].v,&pack[i].w);
        pack[i].avg=pack[i].v/pack[i].w;
        pack[i].seq=i;
        pack[i].x=0;
    }
    sort_pack(pack,n);

    float c=M;
    int i;
    float sum=0;
    for(i=0;i<n;i++){
        if(pack[i].w>c)break;
        pack[i].x=1;
        c-=pack[i].w;
        sum+=pack[i].v;
    }
    if(i<n){pack[i].x=c/pack[i].w;sum+=pack[i].x*pack[i].v;}


    printf("装入物品最大价值为:%f\n各个背包所选择的百分比是:\n",sum);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){//按初始输入的活动顺序输出
            if(pack[j].seq==i){
                printf(" %d%%",(int)(pack[j].x*100));
                break;
            }
        }
    }
    printf("\n");
}

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;


struct A{
    int s,f,a,seq;
}tim[103];


void sort_huodong(A tim[],int n){
    int t1,t2,t3;
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(tim[j].f<tim[i].f){
                swap(tim[i].s,tim[j].s);
                swap(tim[i].f,tim[j].f);
                swap(tim[i].seq,tim[j].seq);
            }
        }
    }
}
int main(){
    int n;
    printf("请输入活动的个数:\n");
    scanf("%d",&n);
    printf("请输入每个活动的起始时间和结束时间:\n");
    for(int i=0;i<n;i++){
        scanf("%d%d",&tim[i].s,&tim[i].f);
        tim[i].seq=i;
    }
    sort_huodong(tim,n);


    tim[0].a=1;
    int ans=1,j=0;//记录最新被选中的点的序号
    for(int i=1;i<n;i++){
        if(tim[i].s>=tim[j].f){tim[i].a=1;ans++;j=i;}
        else tim[i].a=0;
    }
    printf("一共能开展%d个活动\n各个活动的开展情况是:\n",ans);


    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){//按初始输入顺序输出
            if(tim[j].seq==i){
                printf("%d",tim[j].a);
                break;
            }
        }
    }
    printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值