背包问题

//knap.h

#ifndef _KNAP_H_
#define _KNAP_H_

typedef struct node
{
   int size;
   int val;
   node() { size = 0; val = 0;}
   node(int x,int v) { size = x; val = v;}
} Item;

 

class knap
{
public:
 knap();
 int getValue(int);
 int maxKnown[18];

 Item items[5];
};

#endif

 

//knap.cpp

#include "knap.h"
#include <iostream>

knap::knap()
{
   for(int i = 0; i < 18; ++i)
   {
      maxKnown[i] = -1;
   }
   items[0] = Item(3,4);
   items[1] = Item(4,5);
   items[2] = Item(7,10);
   items[3] = Item(8,11);
   items[4] = Item(9,18);
}

int knap::getValue(int M)
{
   int i,space,max,maxi = 0,t;
   if(maxKnown[M] != -1) return maxKnown[M];
   for(i = 0, max = 0; i < 5; ++i)
   {
    if((space = M - items[i].size) >= 0)
     if((t = getValue(space) + items[i].val) > max)
     {
      max = t; maxi = i;
     }
   }
   maxKnown[M] = max;

   return max;
}

 

//main.cpp

#include "knap.h"

#include <iostream>

using namespace std;

int main(int argc,char* argv [])
{
    knap kk;
    cout<<kk.getValue(17) << endl;

    while(cin.get());
    return 0;
}

 

背包问题的动态编程实现

背包大小17,各个组合条件见items数组.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值