纯C语言:贪心部分背包问题源码
来源:互联网 发布:usb hub 知乎 编辑:程序博客网 时间:2024/04/30 07:40
#include<stdio.h>struct Bag{int BagID;int BagWeight;int BagPrice;int SinglePrice;float Num;};void seekBest(Bag bag[],int n,float bagRL){int i;float BRL=bagRL;for(i=0;i<n;i++){bag[i].Num=0;if(bag[i].BagWeight>BRL)break;else{bag[i].Num=1;BRL=BRL-bag[i].BagWeight;}}if(i<=n){bag[i].Num=BRL/bag[i].BagWeight;}for(i=0;i<n;i++){if(bag[i].Num>0){printf("放入ID号为:%d 重量为 %d 的物品 %f 件!!!\n\n",bag[i].BagID,bag[i].BagWeight,bag[i].Num);}}}void Sort(Bag bag[],int n){ int j; Bag temp; int i; for(i=0;i<n;i++) { bag[i].SinglePrice=bag[i].BagPrice/bag[i].BagWeight; for(i=0;i<n-1;i++) {for(j=0;j<n-i-1;j++){ if(bag[j].SinglePrice<bag[j+1].SinglePrice) { temp=bag[j]; bag[j]=bag[j+1]; bag[j+1]=temp; }} } }}void main(){float bagRL;Bag bag[5];bag[0].BagID=1;bag[0].BagPrice=5;bag[0].BagWeight=4;bag[0].Num=3;bag[1].BagID=2;bag[1].BagPrice=6;bag[1].BagWeight=7;bag[1].Num=2;bag[2].BagID=3;bag[2].BagPrice=7;bag[2].BagWeight=4;bag[2].Num=5;bag[3].BagID=4;bag[3].BagPrice=9;bag[3].BagWeight=3;bag[3].Num=4;bag[4].BagID=5;bag[4].BagPrice=13;bag[4].BagWeight=6;bag[4].Num=2;Sort(bag,5);printf("请输入你的背包的容量: ");scanf("%f",&bagRL);putchar(10);seekBest(bag,5,bagRL);}2#include<iostream.h>#include<malloc.h>#define N 50struct Object{int list; // 物体的编号 float p; // 物体的价值 float w; // 物体的重量 float v; // 物体的价值重量比 }; void MERGE(Object A[],int low,int mid,int high){int h,i,j,k; Object* B=(Object*)malloc((high-low+1)*sizeof(Object)); h=low; i=0; j=mid+1; while (h<=mid && j<=high) { if (A[h].v>=A[j].v ){ B[i]=A[h];h=h+1 ;} else { B[i] =A[j]; j=j+1 ; } i++; } if( h>mid) { for (k=j;k<=high;k++) { B[i]=A[k]; i=i+1; } } else for (k=h;k<=mid;k++) { B[i] =A[k]; i=i+1; } i=0; for (k=low;k<=high;k++) { A[k] =B[i] ; i++; } free(B);} void MERGESORT(Object array[],int low,int high) { int mid; if( low<high) { mid=(low+high)/2; MERGESORT(array,low,mid) ; MERGESORT(array,mid+1,high) ; MERGE(array,low,mid,high) ; } } /**************************************************************** 24. * 求解背包问题的贪婪算法 25. * 26. * 输入:背包载重量M, 存放n个物体属性的数组instance[],物体个数n 27. * 输出:n个物体被装入背包的份量x[],背包中物体的最大总价 28. ****************************************************************/ float knapsack_greedy(float m, Object instance[], float x[], int n){ int i; float p = 0; // 总价值初始为0 /* 初始化 */ for(i=0; i<n; i++) { instance[i].v = instance[i].p / instance[i].w; //计算物体价值重量比 x[i] = 0; // 默认放入份量为0 } /* 对物体进行排序:按v的递减顺序 */ MERGESORT(instance,0,n-1); /* 填物过程 */ for(i=0; i<n; i++) { if(instance[i].w<=m) { // 若物体重量小于等于剩余载重量 x[i] = 1; // 将物体全部装入 置x[i]为1 m -= instance[i].w; // 从剩余载重量中去掉物体的重量 p += instance[i].p; // 总价值加上物体的完整价值 } else{ // 若物体重量大于剩余载重量 x[i] = m / instance[i].w; // 置x[i]为剩余载重量/物体重量:即最大能置入的百分比 p+= x[i]*instance[i].p; // 总价值加上物体装入部分的价值 break; // 此时背包已满,可以退出循环 } } return p; } void main() { Object instance[N]; // n个物体的属性 float x[N]; // n个物体装入背包的份量(0<=x[i]<=1) float m; // 背包的最大载重量 int n; // 物体个数 int i; /* 输入开始 */ cout<<"请输入背包的载重量:"; cin>>m; cout<<"请输入物体的个数:"; cin>>n; cout<<"请输入物体的价格、重量:"<<endl; cout<<"--------------------------------------"<<endl; for(i=0; i<n; i++) { cout<<"第"<<(i+1)<<"件物品"; instance[i].list=i+1; cin>>instance[i].p>>instance[i].w; cout<<"--------------------------------------"<<endl; } /* 输入结束 */ /* 计算最大价值和各物体装入的重量 */ float maxv = knapsack_greedy(m, instance, x, n); /* 输出开始 */ cout<<endl<<endl<<"可装入的最大价值是:"<<maxv<<endl; cout<<"--------------------------------------"<<endl; cout<<"每个物体各装入:"<<endl; cout<<"--------------------------------------"<<endl; for( i=0; i<n; i++) { cout<<"第"<<instance[i].list <<"件物品"; cout<<"价值:"<<instance[i].p<<" 总量:"<<instance[i].w<<" 价值总量比:"<<instance[i].v<<" 放入数量:"<<x[i]*instance[i].w<<endl; cout<<"--------------------------------------"<<endl; } }
0 0
- 纯C语言:贪心部分背包问题源码
- 纯C语言:贪心Prim算法生成树问题源码
- 部分背包问题-贪心法源码
- 纯C语言:贪心Kruskal算法生成树源码
- 纯C语言:分治假币问题源码
- 部分背包问题(贪心)
- 贪心法:部分背包问题
- C语言之贪心算法(背包问题)
- 贪心算法解决部分背包问题
- 贪心算法---0/1部分背包问题
- 【算法】贪心策略实现部分背包问题
- 算法学习:贪心解部分背包问题
- 部分背包问题(贪心) HDU1009
- C++ 贪心算法部分背包问题
- 贪心法——部分背包问题
- 部分背包问题(贪心算法)
- 贪心法部分背包问题的实现
- 算法/贪心算法/FractionalKnapsack部分背包问题
- 纯C语言:谈心会议安排源码
- QT事件处理 (一)之 重载事件处理器
- javascript内部原理篇[javascript实现继承]
- C常识
- win8.1 64bit下IIS8.5无法连接Access数据库的解决方案
- 纯C语言:贪心部分背包问题源码
- LTE RLC理解(一)
- string 与char* char[]之间的转换
- MFC中(Edit)编辑框实现输出换行
- 纯C语言:贪心Prim算法生成树问题源码
- 【黑马训练营】"打开/保存"文件对话框的相关运用备忘
- 修改字符串 (华为入职前练习)
- 纯C语言:贪心Kruskal算法生成树源码
- C++读写文本文件