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
    评论
好的,关于C语言贪心算法背包问题,我可以给你一些基本的思路和代码实现。 首先,背包问题是一个经典的动态规划问题,但是在某些情况下,使用贪心算法也可以得到较好的解。对于背包问题,我们可以将物品按照单位重量的价值从大到小排序,然后依次将物品放入背包中,直到背包装满或者所有物品都放完为止。 下面是C语言实现贪心算法解决背包问题代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 1000 typedef struct { int w; // 物品重量 int v; // 物品价值 double r; // 单位重量价值 } Item; int cmp(const void *a, const void *b) { Item *ia = (Item *)a; Item *ib = (Item *)b; return ib->r > ia->r ? 1 : -1; } double knapsack(Item items[], int n, int W) { qsort(items, n, sizeof(Item), cmp); // 按照单位重量价值从大到小排序 double value = 0.0; // 背包中物品的总价值 int i; for (i = 0; i < n && W > 0; i++) { if (items[i].w <= W) { // 物品可以全部放入背包中 value += items[i].v; W -= items[i].w; } else { // 物品只能部分放入背包中 value += items[i].r * W; W = 0; } } return value; } int main() { int n, W; Item items[MAX_N]; printf("请输入物品数量和背包容量:"); scanf("%d%d", &n, &W); printf("请输入每个物品的重量和价值:\n"); int i; for (i = 0; i < n; i++) { scanf("%d%d", &items[i].w, &items[i].v); items[i].r = (double)items[i].v / items[i].w; // 计算单位重量价值 } double value = knapsack(items, n, W); printf("背包中物品的总价值为:%.2f\n", value); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值