算法设计与分析:背包问题、活动安排(C/C++/Java)

运用贪心算法来解决背包问题和活动安排问题。

C/C++:

活动安排:

#include<stdio.h>

typedef struct
{
    int id;         // 活动编号
    int start;      // 开始时间
    int end;        // 结束时间
    int YorN; // 是否被选择,0 否, 1 是
} activity, *Pactivity ;

void merge(activity c[], activity d[], int left, int m, int right)
{
    int i = left, j = m + 1, k = left;
    while((i <= m) && (j <= right))
    {
        if(c[i].end<=c[j].end)
            d[k++] = c[i++];
        else
            d[k++] = c[j++];
    }

    if(i > m)
        for(int q = j; q <= right; q++)
        {
            d[k++] = c[q];
        }
    else
    {
        for(int q = i; q <= m; q++)
        {
            d[k++] = c[q];
        }
    }

}
void mergePass(activity a[], activity b[], int s, int len)
{
    int i = 0;
    while(i <= len - 2 * s)
    {
        merge(a, b, i, i + s - 1, i + 2 * s - 1);
        i = i + 2 * s;
    }
    if(i + s < len)
    {
        merge(a, b, i, i + s - 1, len - 1);
    }
    else
    {
        for(int j = i; j < len; j++)
        {
            b[j] = a[j];
        }
    }
}

void mergeSort(activity act1[], int len)
{
    activity act2[len];
    int s = 1;

    while(s < len)
    {
        mergePass(act1, act2, s, len);
        s += s;
        mergePass(act2, act1, s, len);
        s += s;
    }
}

void printAll(activity act[], int n)
{
    for(int i = 1; i <= n; i++)
    {
        printf("第%d个活动为%d,时间是:%d ———— %d\n", i, act[i].id, act[i].start, act[i].end);
    }
}

void printSelected(activity act[], int n)
{
    for(int i = 1, j = 1; i <= n; i++)
    {
        if(act[i].YorN)
            printf("第%d个被选择的活动为%d,时间是:%d ———— %d\n", j++, act[i].id, act[i].start, act[i].end);
    }
}

int greedySelector(activity ACT[], int n){
    ACT[1].YorN= 1;
    int j = 1, count = 1;
    for(int i = 2; i <= n; i++){
        if(ACT[i].start >= ACT[j].end){
            ACT[i].YorN = 1;
            j = i;
            count++;
        }
    }
    return count;
}

int main()
{
    int n;
    printf("请输入活动个数:");
    scanf("%d", &n);

    activity ACT[n+1];
    ACT[0].id = ACT[0].start = ACT[0].end = 0;

    for(int i = 1; i <= n; i++)
    {
        printf("请输入第%d个活动的开始时间和结束时间:", i);
        scanf("%d %d", &ACT[i].start, &ACT[i].end);
        ACT[i].id = i;
        ACT[i].YorN = 0;
    }

    // 按照结束时间非降序排列活动
    mergeSort(ACT, n+1);

    printAll(ACT, n);

    printf("\n总共有%d个活动被选择\n", greedySelector(ACT, n));

    printSelected(ACT, n);

    return 0;
}

Java:

背包问题:

import java.util.Scanner;

public class Package {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("请输入背包容量:");
        float c = s.nextFloat();

        System.out.print("请输入物品数量:");
        int n = s.nextInt();

        float[] w = new float[n];
        float[] v = new float[n];
        float[] x = new float[n];

        for (int i = 0; i < n; i++) {
            System.out.print("请输入第" + (i+1) + "件物品的重量和价值:");
            w[i] = s.nextFloat();
            v[i] = s.nextFloat();
        }

        System.out.println("最大价值为:" + knapsack(c, w, v, x));
    }

    public static float knapsack(float c, float[] w, float [] v,float[] x){
        int n = v.length;
        Element[] d = new Element[n];

        for (int i = 0; i < n; i++) {
            d[i] = new Element(w[i], v[i], i);
        }
        mergeSort(d);

        int i;
        float opt = 0;
        for (i = 0; i < n; i++) {
            x[i] = 0;
        }

        for (i = 0; i < n; i++) {
            if(d[i].w > c){
                break;
            }
            x[d[i].id] = 1;
            opt += d[i].v;
            c -= d[i].w;
        }
        if(i < n){
            x[d[i].id] = c / d[i].w;
            opt += x[d[i].id] * d[i].v;
        }

        return opt;
    }

    //归并排序
    static void merge(Comparable c[], Comparable d[], int l, int m, int r) {
        int i = l, j = m + 1, k = l;
        while ((i <= m) && (j <= r)) {
            if (c[i].compareTo(c[j]) >= 0)
                d[k++] = c[i++];
            else
                d[k++] = c[j++];
        }

        if (i > m)
            for (int q = j; q <= r; q++) {
                d[k++] = c[q];
            }
        else {
            for (int q = i; q <= m; q++) {
                d[k++] = c[q];
            }
        }

    }

    static void mergePass(Comparable a[], Comparable b[], int s, int len) {
        int i = 0;
        while (i <= len - 2 * s) {
            merge(a, b, i, i + s - 1, i + 2 * s - 1);
            i = i + 2 * s;
        }
        if (i + s < len) {
            merge(a, b, i, i + s - 1, len - 1);
        } else {
            for (int j = i; j < len; j++) {
                b[j] = a[j];
            }
        }
    }

    static void mergeSort(Comparable a[]) {
        int len = a.length;
        Comparable[] b = new Comparable[len];

        int s = 1;

        while (s < len) {
            mergePass(a, b, s, len);
            s += s;
            mergePass(b, a, s, len);
            s += s;
        }
    }
}

class Element implements Comparable{
    int id;
    float w;
    float v;

    public Element(){

    }

    public Element( float w, float v, int id) {
        this.id = id;
        this.w = w;
        this.v = v;
    }

    @Override
    public int compareTo(Object o) {
        if((this.v / this.w) < (((Element)o).v / ((Element)o).w)){
            return -1;
        }else if((this.v / this.w) == (((Element)o).v / ((Element)o).w)){
            return 0;
        }else
            return 1;
    }

    @Override
    public String toString() {
        return "Element{" +
                "id=" + id +
                ", w=" + w +
                ", v=" + v +
                '}';
    }
}

qq:1351006594

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aaron_Liu0730

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值