动态规划01背包问题c++

#include <iostream>
#include <fstream>

using std::cout;
using std::endl;
using std::ifstream;

const char* file_in="/home/yuanzhen/C_script/01beibao/beibao0.in";
const int max_people=10000;
const int max_mine=100;

int mine;
int peopleTotal;
int peopleNeed[max_mine];
int Gold[max_mine];
int sumGold[max_people][max_mine];

void init()
{
    cout << file_in << endl;
    ifstream inputFile(file_in);

    inputFile >> peopleTotal >> mine;

    for (int i=0;i<mine;++i)
      inputFile >> peopleNeed[i] >> Gold[i];

    for(int i=0;i<max_people;++i)
      for(int j=0;j<max_mine;++j)
        sumGold[i][j]=-1;

    inputFile.close();
}

int getMaxGold(int people, int mineNum)
{
    int totalGold;
    if(sumGold[people][mineNum]!=-1)
      //return sumGold[people][mineNum];
      totalGold=sumGold[people][mineNum];
    else if(mineNum==0)
    {
        if(people>=peopleNeed[mineNum])
          totalGold=Gold[mineNum];
        else
        {
            totalGold=0;
        }
    }
    else
    {
        if(people>=peopleNeed[mineNum])
          totalGold=std::max(getMaxGold(people, mineNum-1), getMaxGold(people-peopleNeed[mineNum],mineNum-1)+Gold[mineNum]);
        else
          totalGold=getMaxGold(people, mineNum-1);
    }
    sumGold[people][mineNum]=totalGold;
    return totalGold;
}

int main(int argc, char** argv)
{
    init();

    cout << "peopleTotal" << "\t" << peopleTotal << endl;
    cout << "mine" << "\t" << mine << endl;
    cout << "peopleNeed\t" ;
    for(int i=0;i<mine;++i)
      cout << peopleNeed[i] << "\t";
    cout << endl;

    cout << "Gold\t";
    for(int i=0;i<mine;++i)
      cout << Gold[i] << "\t";
    cout << endl;

    int result=getMaxGold(peopleTotal, mine);
    cout << "result\t" << result << endl;
}
 

转载于:https://my.oschina.net/lCQ3FC3/blog/833897

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值