01背包问题算法实现

算法的思想参考:参考

http://blog.csdn.net/liufeng_king/article/details/8683136

01背包问题的算法实现如下:

// Test.cpp : 定义控制台应用程序的入口点。
//关于01背包问题的代码

#include "stdafx.h"
const int n=4;//物品的数目
const int c=8;//背包的最大承重
const int w[]={1,4,2,3};//每个物品的重量
const int v[]={2,1,4,3};//每个物品的价值
int m[4][9];//记录临时最优解,数组长度为9,分别代表了剩余重量0-8;
int max(int a,int b){
    return a>b?a:b;//返回a和b中的最大值
}
void knapsack(){
    int i=0;
    int j=0;
    //初始化
    for(j=0;j<=c;j++)
    {
        if(j>=0&&j<w[n-1])
            m[n-1][j]=0;
        else
            m[n-1][j]=v[n-1];
    }
    //递归
    for(i=2;i>=0;i--){
        for(j=0;j<=c;j++)
        {
            if(j>=0&&j<=w[i])
                m[i][j]=m[i+1][j];
            else
                m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    knapsack();
    for(int i=0;i<n;i++){
        for(int j=0;j<=c;j++)
            printf("%d  ",m[i][j]);
        printf("\n");
    }
    return 0;
}

接下来分析一下本题的大概思路:

   对于本题,若采用整数背包解决, 时间复杂度m*n*k,空间复杂度O(m*k),大概思路就是DP[i,j]记录用 i 个元素可以组合和为j的数。将元素S[a]一个一个放入,if(DP[i,j] == true) DP[i+1,j + S[a]] = true;最后用O(n)来找一下DP[3,j]中对应的最大的d。


你可能感兴趣的:(01背包问题)