掌握按贪心方法原理求背包问题最优解的方法
一、问题描述
背包问题描述如下: 已知
背包容量M=120
物品种类数n=10
各种物品的总效益pi(i=1,2,………10) :50,60,70,80,90,80,70,60,50,40
各种物品的总重量wi(i=1,2………10) :17,30,25,41,80,70,64,56,47,38
求: 各种物品所取重量占其总重量的比例xi(i=1,2,…..10),满足0<=xi<=1,
使得背包装满,且使背包装入的物品总价值达到最大值.
三、基本要求
按三种不同的量度标准分别计算所得最大总效益,然后比较哪个最大
1. 按效益值由大到小取物品. 2. 按重量值由小到大取物品
3.按比值pi/wi的值由大到小取物品
代码:
#include<stdio.h>
#include<stdlib.h>
struct beibao{
float pi;
float wi;
float xi;
};
//#define M 120
#define n 10
void sort1(struct beibao a[n]);
void sort2(struct beibao a[n]);
void sort3(struct beibao a[n]);
void print1(struct beibao a[n]);
void print2(struct beibao a[n]);
void f(struct beibao a[n]);
int main(){
int i;
struct beibao a[10]={ {50,17,0},{60,30,0},{70,25,0},{80,41,0},{90,80,0},
{80,70,0},{70,64,0},{60,56,0},{50,47,0},{40,38,0}};//赋初值
struct beibao *p=a;
sort1(p) ;//排序
printf("排序后的结构体序列:\n");
print1(p);
f(p);//方式1
printf("\n");
sort2(p) ;//排序
printf("排序后的结构体序列:\n");
print1(p);
f(p);//方式2
printf("\n");
sort3(p) ;//排序
printf("排序后的结构体序列:\n");
print1(p);
f(p);//方式3
return 0;
}
void sort1(struct beibao a[n]){ //效益大->小
int i,j;
struct beibao temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-j-1;j++) {
if(a[j].pi<a[j+1].pi){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void sort2(struct beibao a[n]){ //质量小->大
int i,j;
for(i=0;i<n;i++){
a[i].xi=0;
}
struct beibao temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++) {
if(a[j].wi>a[j+1].wi){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void sort3(struct beibao a[n]){ //pi/wi 大->小
int i,j;
for(i=0;i<n;i++){
a[i].xi=0;
}
struct beibao temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++) {
if(a[j].pi/a[j].wi<a[j+1].pi/a[j+1].wi){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void print2(struct beibao a[n]){
int i;
printf("物品序号i ");//输出
for(i=1;i<=n;i++){
printf(" %d ",i);
}
printf("总效益\n") ;
printf(" xi ");
for(i=0;i<n;i++){
printf("%0.3f ",a[i].xi);
}
}
void print1(struct beibao a[n]){
int i;
float total=0;
printf("物品序号i ");//输出
for(i=1;i<=n;i++){
printf("%d ",i);
}
printf("总效益\n") ;
printf(" pi wi xi ");
for(i=0;i<n;i++){
printf("%0.0f %0.0f %0.0f ",a[i].pi,a[i].wi,a[i].xi);
}
printf(" %0.2f\n",total);
}
void f(struct beibao a[n]){
struct beibao *p=a;
float leave=120;
float total=0;
int i;
for(i=0;i<n;i++){
if(leave==0) break;
else if(leave>=a[i].wi){
leave=leave-a[i].wi;
total=total+a[i].pi;
a[i].xi=1;
}
else if(leave<a[i].wi&&leave>0) {
a[i].xi=leave/a[i].wi;
total=total+a[i].pi*a[i].xi;
leave=0;
break;
}
}
printf("装袋后的结构体序列:\n");
print2(p);
printf(" %0.2f\n\n",total);
}