0-1背包问题的一种解法

来源:互联网 发布:星际淘宝网最新章节 编辑:程序博客网 时间:2024/06/05 08:29

背包问题就是求一定重量的最大价值,通过这句话,我想到了  “重权比”---重量/权值  ,一定重量,重权比越小。

源代码:

#include<stdio.h>struct WP//定义物品类型结构体包括以下:{intnum;//物品编号,floatweight;//物品重量,floatprice;//物品价值floatw_p;//重权比(重量/价值(权值))}goods[5],temp;//定义一个结构体数组,和一个用于交换的结构体变量void main(){int i,j;//循环变量float W=10.0,P=0.0;//重量上限 最大价值for(i=1;i<=5;i++)//为物品进行初始化,指出重量和价值{goods[i].num=i;printf("请输入第 %d 件物品的重量和价值,以逗号隔开: ",i);scanf("%f,%f",&goods[i].weight,&goods[i].price);//printf("%f",goods[i].price);}printf("物品描述如下:\n");//规范化输出物品的详细情况printf("编号重量价值重权比\n");for(i=1;i<=5;i++){goods[i].w_p=goods[i].weight/goods[i].price;printf("%d%.2f%.2f%.4f",goods[i].num,goods[i].weight,goods[i].price,goods[i].w_p);printf("\n");}for(i=1;i<=5;i++)//按照重权比的大小进行排序,按升序排for(j=i+1;j<=5;j++)if(goods[i].w_p>goods[j].w_p){//WP temp;temp=goods[i];goods[i]=goods[j];goods[j]=temp;}printf("编号重量价值重权比\n");//输出排序后的物品情况for(i=1;i<=5;i++){goods[i].w_p=goods[i].weight/goods[i].price;printf("%d%.2f%.2f%.4f",goods[i].num,goods[i].weight,goods[i].price,goods[i].w_p);printf("\n");}for(i=1;i<=5;i++)//取物品,使其价值最大if(goods[i].weight<=W){W-=goods[i].weight;P+=goods[i].price;}printf("价值最高为: %.2f \n",P);//输出最大价值}


 暂时像这样上传着!