揹包問題

題目:

假設有一個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物
品,假設是水果好了,水果的編號、單價與重量如下所示:

0 李子4KG $4500

1 蘋果5KG $570

2 橘子2KG $225

3 草莓1KG $110

4 甜瓜6KG $670

思路

設有8個揹包,負重從1,2…..8. 物品編號從0,1……4.兩個循環嵌套在一起。從物品0開始,一次考慮負重1,2,到8. 然後物品1,2,到4.

每一個揹包每一次考慮放入不放入這個物品。任意重量的任意物品考慮之後的揹包都是最優解。

有兩個‘指針’,記錄當下考慮的揹包,和減去當下這輪物品重量的揹包。既,‘要不要退到某個最佳解騰出這個物品的重量,加上這個物品’

代碼




#include <stdio.h>
#include <stdlib.h>

#define MAXWEIGHT 8
#define TOTALITEMS 5

struct packItem{

    char name[100];
    int value;
    int weight;

};


void main(){

    struct packItem pck[]={{"lizi",450,4},{"Apple",570,5},{"Orange",225,2},{"Strawberry",110,1},{"Melo",670,6}};

//printf("\n%s",pck[0].name);

    int items[MAXWEIGHT+1];
    int values[MAXWEIGHT+1];

    int tmp,tmp2;

    int i,j,k;
    for(k=0; k<MAXWEIGHT+1; k++){

        items[k]=0;
        values[k]=0;

    }


    i=1;
    while(i<TOTALITEMS+1){

        for(j=1; j<MAXWEIGHT+1; j++){

                if(j<pck[i-1].weight){
                    continue;
                }   

                tmp=j-pck[i-1].weight;
                if(values[tmp] + pck[i-1].value >= values[j]){

                        values[j] = values[tmp] + pck[i-1].value;
                        items[j] = i;
                        continue;
                }

                else{

                        continue;
                }


            }



        i++;
    }


    for(k=1; k<MAXWEIGHT+1; k++){

        printf("\n%d", values[k]);


    }



    for(k=MAXWEIGHT; k>0; k=k-tmp2){

        printf("\nPut%s ",pck[items[k]-1].name);
        printf(" %d ",pck[items[k]-1].weight);
        tmp2= pck[items[k]-1].weight;

    }


    system("pause");


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章