背包问题
// 程序8-4-2.cpp : 定义控制台应用程序的入口点。
//
//背包问题:贪心算法
#include "stdafx.h"
#define maxnumber 20
typedef struct node
{
float w;
float v;
int i;
} Object;
float find(Object wp[], int n, float M)
{
float x[maxnumber];
int i;
float maxprice = 0;
for( i= 1; i <=n; i++) //初始化x[n]
{
x[i] = 0.0;
}
i = 0;
while(wp[i].w < M)
{
x[wp[i].i] = 1;
M = M -wp[i].w;
i++;
}
x[wp[i].i] = M/wp[i].w;
//输出解向量
printf("解向量是:\n");
for(i = 1; i <= n; i++)
{
printf("x[%d] = %f", i, x[i]);
}
printf("\n");
//计算最大价值
for(i = 0; i < n; i++)
{
maxprice = maxprice + wp[i].v*x[wp[i].i];
}
return maxprice;
}
//float find(Object wp[], int n, float M)
void bubble_sort(Object wp[], int n)
{
int flag = 1, temp;
for(int i = 0; i < n-1 && flag; i++)
{
flag = 0;
for(int j = 0; j <n -1 -i; j++)
{
if(wp[j].v/wp[j].w > wp[j+1].v/wp[j+1].w)
{
flag = 1;
temp = wp[j+1].i;
wp[j+1].i = wp[j].i;
wp[j].i = temp;
temp = wp[j+1].w;
wp[j+1].w = wp[j].w;
wp[j].w = temp;
temp = wp[j+1].v;
wp[j+1].v = wp[j].v;
wp[j].v = temp;
}
}
}
}
void output(Object wp[], int n)
{
for(int i = 0; i < n; i++)
{
printf(" %d", wp[i].i);
printf(" %0.2f", wp[i].w);
printf(" %0.2f", wp[i].v);
printf("\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Object wp[maxnumber];
int i, j, n;
float C; //背包的重量
int flag;
float maxprice, temp;
printf("请输入物品的种数:");
scanf("%d", &n);
printf("请输入背包的重量:");
scanf("%f", &C);
printf("\n请输入物品的序号、重量和价值:\n");
for(i = 0; i < n; i++)
{
scanf("%d", &wp[i].i);
scanf("%f", &wp[i].w);
scanf("%f", &wp[i].v);
}
printf("\n输入的物品是\n i w v\n");
output(wp, n);
//用冒泡排序对物品按单位价值进行排序
bubble_sort(wp, n);
printf("\n 排序后的物品是\n i w v\n");
output(wp, n);
maxprice = find(wp, n, C);
printf("\n 物品的总价值为:%f\n", maxprice);
return 0;
}