最基本的01背包问题

1

使用动态规划,dp[i][j]存储:到第i个物品时,空间大小为j的情况下的最大价值

转移方程是:dp[i][j] = max(dp[i-1][j],dp[i-1][j - weight[i]] + value[i])

时间复杂度是O(NV),N为物品的个数,V为最大容量,空间复杂度为O(NV)

#include<iostream>
using namespace std;

const int N = 5;
const int volumn = 1000;
int dp[N + 1][volumn + 1];
const int value[N+1] = {0,8,10,4,5,5};//下标从1开始
const int weight[N+1] = {0,600,400,200,200,300};//下标从1开始

void dp_01()
{
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= volumn; j++)
       {
          if(j >= weight[i])
            dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
          else
            dp[i][j] = dp[i-1][j];
       }
    cout << dp[N][volumn]<<endl;
}
int main()
{
    dp_01();
    return 0;
}

2 简化空间复杂度的01背包解法:

使用一维空间f[volumn+1],来替代dp[][]。

View Code
#include<stdio.h>
#include<iostream>
#include<limits.h>
using namespace std;

const int T = 5;
const int V = 10;
int f[V + 1];
int W[T] = {8,10,4,5,5};
int C[T] = {6,4,2,2,3};
int max(const int& a, const int& b)
{
    return a >= b ? a:b;
}
void package()
{
    freopen("out.txt","w",stdout);
    //init
    for(int i = 1; i <= V; i++)
    {
    f[i] = INT_MIN;//必须装满的情况
        //f[i] = 0;//可以不装满的情况
    }
    f[0] = 0;
    for(int i = 0; i < T; i ++)
    {
    for(int v = V; v >= C[i]; v--)
    {
        f[v] = max(f[v-C[i]] + W[i],f[v]);
    }
    }
    cout << f[V] << endl;
}
int main()
{
    package();
    return 0;
}

 

posted on 2013-05-04 17:40 T000ny 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/majianbin/archive/2013/05/04/3059739.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值