2020-08-11 0-1背包问题的多种解法

因为之前做过实验,这里就不赘述了。

背包类&初始化数据:

#include<vector>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

#define N   10

class Backage
{
private:
    int         num;
    int         w[N] = {19,23,12,34,24,34,56,24,53,35};
    int         v[N] ={57,68,87,17,12,21,31,42,14,15};
    int         capility;
    int         cv;
    int         cw;
    int         bestv;
public:
    Backage();
    int Backtrace(int i);
    int Dp();
};

1.回溯法

Backage::Backage(){
    num=10;
    capility=300;
    cv=0;
    cw=0;
    bestv=0;
}

int Backage::Backtrace(int i)
{
    if (i>=N){
        bestv=bestv>cv?bestv:cv;
        return bestv;
    }
    if (cw+w[i]>capility)
        return bestv;
    int sum=0;
    for(int j=i;j<N;j++)
        sum+=v[j];
    sum+=cv;
    if (sum<bestv){
        return bestv;
    }
    cv+=v[i];
    cw+=w[i];
    Backtrace(i+1);
    cv-=v[i];
    cw-=w[i];
    Backtrace(i+1);
    return bestv;
}

int main(){
    Backage b;
    int bestv1=b.Backtrace(0);
    cout<<"回溯法求得最大价值为:"<<bestv1<<endl;
    system("pause");
    return 1;
}

2.动态规划法

int Backage::Dp()
{
    int DP[capility]={0};
    for(int j=0;j<N;j++)
    {
        for (int i=capility;i>=w[j];i--)
        {
            DP[i]=DP[i]>(DP[i-w[j]]+v[j])?DP[i]:(DP[i-w[j]]+v[j]);
        }
    }
    return DP[capility];
}


int main(){
    Backage b;
    int bestv2=b.Dp();
    cout<<"动态规划法求得最大价值为:"<<bestv2<<endl;
    system("pause");
    return 1;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。