背包问题(贪心方法原理)

    掌握按贪心方法原理求背包问题最优解的方法

一、问题描述

   背包问题描述如下:  已知

   背包容量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);
}

猜你喜欢

转载自blog.csdn.net/huang1600301017/article/details/81023046