贪心算法-背包问题2

来源:互联网 发布:手机中通抢单软件 编辑:程序博客网 时间:2024/05/17 03:31

对上次的C语言代码做了一些修改,可以打印出装进背包里面的物品的顺序编号。

// 贪心算法-背包问题-解向量.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <algorithm>using namespace std;#define N 3int flag = 0;//装进物品的总数标记typedef struct{    int w;//重量    int v;//价值    double c; //性价比    int index;}bag;bool cmp(bag a, bag b){    return a.c > b.c;}double GreedyKnapsack(bag a[], int n, double weight){ //返回最大价值    double c_left = weight;  //背包的剩余容量    int i = 0;    double b = 0; //获得的价值    while (i < n&&a[i].w < c_left)    { //能够放下整个的物品时        c_left = c_left - a[i].w;        b = b + a[i].v;        ++i;        ++flag;    }    if (i < n)    {//只能放下物品的一部分时        b = b + a[i].v*(c_left / a[i].w);        ++flag;    }    return b;}int main(){    int sum_weight;    double value;  // 书包所能容纳的最大价值    printf("请输入书包的负重:");    scanf_s("%d", &sum_weight);    bag bags[N];    printf("请依次输入%d种物品的重量和价值:\n", N);    for (int i = 0; i < N; i++)    {        printf("物品%d\t", i);        scanf_s("%d", &bags[i].w);        scanf_s("%d", &bags[i].v);        bags[i].index = i;        bags[i].c = (bags[i].v*1.0) / bags[i].w;    }    sort(bags, bags + N, cmp);    value = GreedyKnapsack(bags, N, sum_weight);    printf("该书包所能容纳的最大价值是:%.2f\n", value);    printf("装进书包里的物品顺序是:");    for (int i = 0; i < flag; i++)        printf("%d", bags[i].index);    printf("\n\n");    return 0;}

测试用例

0 0
原创粉丝点击