#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 20
typedef struct Item
{
double w; //物品重量
double v; //物品价值
double vDw; //物品单位重量的价值
int index; //物品下标
}Item;
Item item[MAX]; //物品
double x[MAX]; //x[i]表示装入的数量 0<=x[i]<=1
int cmp(const void *item1, const void *item2) //对物品按单位重量价值降序
{
if((*(Item *)item1).vDw < (*(Item *)item2).vDw)
return 1;
else
return 0;
}
//返回背包所容纳物品的最大价值
//n为武平数量,c为背包容量
double knapsack(int n, double c)
{
qsort(item, n, sizeof(Item), cmp); //对物品按单位重量价值升序
memset(x, 0, n);
int i;
double vlue = 0;
for(i=0; i<n; i++) //依次对每一个物品进行检查
{
if(item[i].w>c) //如果物品不能整个装入,跳出循环
break;
x[i] = 1; //物品i被装入
c -= item[i].w; //背包剩余容量减少
vlue += item[i].v; //价值增大
}
if(i<n && c>0) //如果背包还没有装满
{
x[i] = c / item[i].w; //如果背包还有剩余容量,取物品的一部分将背包装满
vlue += x[i] * item[i].v ;
}
return vlue;
}
int main()
{
int n = 3;
double c = 50;
double w[] = {20, 30, 10};
double v[] = {100, 120, 60};
int i;
for(i=0; i<n; i++)
{
item[i].w = w[i];
item[i].v = v[i];
item[i].vDw = v[i]/w[i];
item[i].index = i+1;
}
double u = knapsack(n, c);
printf("背包容量为:%.2f\n", c);
printf("背包所状物品的最大价值为: %.2f\n", u);
printf("所选的物品为:\n");
for(i=0; i<n; i++)
{
if(x[i]>0)
printf("物品%d(重%.2f, 价值%.2f, 单位价值%.2f)所装数量为%.2f\n", item[i].index, item[i].w, item[i].v, item[i].vDw, x[i]*item[i].w);
}
printf("\n");
return 0;
}
背包问题
最新推荐文章于 2024-07-09 16:07:52 发布