完全背包问题描述:有3件物品,它们的重量分别是18,15,10,它们的价值分别是25,24,15,每件物品数量无限个,现在给你个承重为20的背包,用贪心算法如何让背包里装入的物品具有最大的价值总和?
#include<stdio.h>
const int n = 3;
void swap(float a[], int i, int j)
{
float temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void knapsack(float M, float w[], float p[], float x[])
{
float K = 0;
for (int i = 0; i < n; i++)
{
if (M)
{
if (M - w[i] >= 0)
{
M -= w[i];
K += p[i];
x[i] = 1;
}
else
{
K += (M / w[i] * p[i]);
x[i] = M / w[i];
break;
}
}
}
printf("\n\n总收益最大为%f\n", K);
for (int j = 0; j < n; j++)
{
printf("{%d}=%f\n", j+1 , x[j]);
}
}
int main()
{
float M = 20;
//背包所能容纳的重量
float w[] = { 15,10,18};
//每种物品的重量
float p[] = { 24,15,25};
//每种物品的价值
float x[n];
int i, j;
for (i = 0; i < n; i++)
{
int point = i;
for (j = i + 1; j < n; j++)
if ((p[j] / w[j]) > (p[point] / w[point]))
point = j;
swap(w, i, point); swap(p, i, point);
}
printf("p/w非升排序后:\n");
printf("w[]: ");
for (i = 0; i < n; i++)
printf("%f\t",w[i]);
printf("\np[]: ");
for (i = 0; i < n; i++)
printf("%f\t", p[i]);
memset(x, 0, sizeof(x));
knapsack(M, w, p,x);
return 0;
}
输出:
p/w非升排序后:
w[]: 15.000000 10.000000 18.000000
p[]: 24.000000 15.000000 25.000000
总收益最大为31.500000
{1}=1.000000
{2}=0.500000
{3}=0.000000
请按任意键继续. . .