c语言贪心算法背包分割问题,贪心算法-可分割背包问题

给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 ,价值wi

(1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。

有两类背包问题(根据物品是否可以分割),如果物品不可以分割,称为0—1背包问题(动态规划);如果物品可以分割,则称为背包问题(贪心算法)。

解题思路:根据性价比的高低排序,性价高的先装。

#include

#include

struct page{

int wight;

int price;

float t;

int order;

};

void sort(struct page b[],int n)

{  int i,j;

struct

page temp;

for(i=0;i

for(j=0;j

if(b[j].t

{

temp=b[j];

b[j]=b[j+1];

b[j+1]=temp;

}

}

void main ()

{

int i,w,n;

float sum=0,sumprice=0;

printf("请输入背包能背的重量,物品的个数:\n");

scanf("%d%d",&w,&n);

struct

page *a;

a=(struct page *)malloc(sizeof(struct page)*n);

printf("请输入物品Ni的序号、重量和价格\n");

for(i=0;i

{

scanf("%d%d%d",&a[i].order,&a[i].wight,&a[i].price);

a[i].t=1.0*a[i].price/a[i].wight;

}

sort(a,n);

printf("\n");

for(i=0;i

sum+=a[i].wight;

if(sum

{

for(i=0;i

sumprice+=a[i].price;

printf("物品可全部装入,总价值为%.2f元",sumprice);

}

else

{

sum=0;

sumprice=0;

for(i=0;i

{

sum=sum+a[i].wight;

if(sum>w)

{

sumprice+=(a[i].wight+w-sum)*a[i].t;

printf("装入%d号物品%.2f克\n",a[i].order,a[i].wight+w-sum);

printf("总价值为%.2f元\n",sumprice);

break;

}

printf("装入%d号物品%.2f克\n",a[i].order,a[i].wight*1.0);

sumprice=sumprice+a[i].price;

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值