01背包问题之动态规划

原链接:https://blog.csdn.net/ktigerhero3/article/details/50385109

一直都不太明白遇到一个问题的时候如何确定动态规划,贪心算法,或者是回溯法,作者的博文解释的很明白,用一个形象生动的01背包问题解释了,不是什么样的问题选择什么样的方法,而是用这个方法如何解决你所遇到的问题。

1.动态规划

#include<iostream>
#include<math.h>
using namespace std;
int m[100][100];//m[i][j]表示可选物品1...i,容量为j时的最优解
int dp_knapsack(int w[],int v[],int c,int m[][100],int n)
{
    int i,j;
    //初始化
    for(j=1;j<=c;j++)
        m[1][j]=0;
    for(j=w[0];j<=c;j++)
        m[1][j]=v[0];

    for(i=2;i<=n;i++)
    {
        for(j=1;j<=c;j++)
        {
            if(j<w[i-1])
                m[i][j]=m[i-1][j];
            else if(m[i-1][j]>=(m[i-1][j-w[i-1]]+v[i-1]))
                m[i][j]=m[i-1][j];
            else
                m[i][j]=m[i-1][j-w[i-1]]+v[i-1];
        }
    }
    return 0;
}
int main()
{
    int weight[3]={16,15,15};
    int value[3]={45,25,25};
    int c=30;
    dp_knapsack(weight,value,c,m,3);
    cout<<m[3][30]<<endl;
}

2.贪心算法

不一定能求出最优解,在这个问题上表现的淋漓尽致。

3.回溯法

#include<iostream>
#include<math.h>
using namespace std;
int bestValue=0,curWeight=0,curValue=0;
int backtrack_knapsack(int w[],int v[],int c,int n,int i)
{
    if(i>n)
    {
        if(curValue>bestValue)
        {
            bestValue=curValue;
        }
        return 0;
    }
    if(curWeight+w[i-1]<=c)
    {
        curWeight+=w[i-1];
        curValue+=v[i-1];
        backtrack_knapsack(w,v,c,n,i+1);
        curWeight-=w[i-1];
        curValue-=v[i-1];
    }
    backtrack_knapsack(w,v,c,n,i+1);
    return 0;
}
int main()
{
    int weight[3]={16,15,15};
    int value[3]={45,25,25};
    int c=30;
    //dp_knapsack(weight,value,c,m,3);
    backtrack_knapsack(weight,value,c,3,1);
    printf("%d\n",bestValue);
}

猜你喜欢

转载自blog.csdn.net/qq_17141957/article/details/81186728