对上次的C语言代码做了一些修改,可以打印出装进背包里面的物品的顺序编号。
#include "stdafx.h"
#include <algorithm>
using namespace std;
#define N 3
int 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;
}
