贪心法求解活动安排问题(C语言)

#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef struct {
int begin;
int end;
int flag;//标记是否被安排
}active;

int main()
{
    int num;//活动数量;
    active act[N];
    printf("请输入活动数量");
    scanf("%d",&num);
    printf("请输入活动的开始时间");
    for(int i=0;i<num;i++)
    {
        scanf("%d",&act[i].begin);
    }
    printf("请输入活动的结束时间");
    for(int j=0;j<num;j++)
    {
        scanf("%d",&act[j].end);
    }
    sort(act,num);
    greedy(act,num);
}

void greedy(active a[],int num)
{
     int current=0;//当前活动下标
     for(int i=0;i<num;i++)
     {
       a[i].flag = 0;//初始所有活动都未被安排
     }
     a[0].flag = 1;//排序后的第一个活动被安排
     /**
     //后面的活动开始的时间晚于当前活动开始的时间则相容
     //而当前活动初始下标为0,故后面的活动i下标要从1开始
     **/
     for(int i=1;i<num;i++)
     {
        if(a[i].begin >= a[current].end)
        {
           a[i].flag = 1;//相容,做标记
           current=i;//当前活动变为i
        }
     }

    //输出
    printf("\n\n");
    printf("按结束时间排序后的活动序号中,以下活动将被安排:\n\n");
    int count=0;
    for(int i=0;i<num;i++)
    {
        if(a[i].flag==1){
            count++;//被安排的活动数量;
            printf("活动%d :开始时间   结束时间:%d,%d\n",i,a[i].begin,a[i].end);
            printf("\n");
        }
    }
    printf("总计%d个活动被安排\n",count);
}

//按照结束时间非降序排序
void sort(active a[],int n)
{
    for (int i=0;i<n;i++)
    {
        for(int j=0;j<n-i-1;j++)
        {
            if(a[j].end>a[j+1].end){
                active temp;
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

在这里插入图片描述
运行结果:
在这里插入图片描述

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
部分背包问题是指,有一个背包容量为C,有n个物品,每个物品有一个重量wi和一个价值vi,可以取走物品的一部分,求背包所能装下的最大价值。 贪心法求解部分背包问题的思路是,按照每个物品的单位重量价值从大到小排序,然后依次装入物品,直到背包装满为止。如果当前物品无法完全装入背包,则将其部分装入,直到背包装满。 以下是部分背包问题的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct { double weight; // 物品重量 double value; // 物品价值 double unit_value; // 物品单位重量价值 } Item; // 按照物品单位重量价值从大到小排序 int cmp(const void *a, const void *b) { Item *item1 = (Item *)a; Item *item2 = (Item *)b; return (item2->unit_value - item1->unit_value) > 0 ? 1 : -1; } int main() { int n = 5; // 物品数量 int C = 10; // 背包容量 Item items[n]; items[0] = (Item){2, 6, 0}; items[1] = (Item){2, 3, 0}; items[2] = (Item){6, 5, 0}; items[3] = (Item){5, 4, 0}; items[4] = (Item){4, 6, 0}; // 计算每个物品的单位重量价值 for (int i = 0; i < n; i++) { items[i].unit_value = items[i].value / items[i].weight; } // 按照物品单位重量价值从大到小排序 qsort(items, n, sizeof(Item), cmp); double value = 0; // 背包所能装下的最大价值 int i = 0; // 当前物品下标 while (C > 0 && i < n) { if (C >= items[i].weight) { value += items[i].value; C -= items[i].weight; } else { value += C * items[i].unit_value; C = 0; } i++; } printf("背包所能装下的最大价值为%f\n", value); return 0; } ``` 在实现中,首先定义了一个Item结构体来存储物品的重量、价值和单位重量价值。然后计算每个物品的单位重量价值,并按照从大到小的顺序排序。最后依次取出每个物品,如果能够完全装入背包,则将其全部装入;否则,将其部分装入,直到背包装满为止。最终输出背包所能装下的最大价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值