背包问题

题目:

假设有一个背包的负重最多可达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");


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值