一般背包问题

完全背包问题描述:有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
请按任意键继续. . .


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值