背包问题

作者: 小路子好 | 来源:发表于2019-02-19 11:51 被阅读3次

简单01背包

有一个箱子容量为v(正整数,0<=v<=2000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间最小
输入描述:一个整数v,表示箱子容量;一个整数n,表示有n个物品;接下来n个整数,分别表示这n个物品的各自体积
输出描述:一个整数,表示箱子的剩余空间
样例输入:

24 6   
8 3 12 7 9 7

样例输出:

0

分析:
第一步:确定状态,用dp[i][j]表示前i个物品在容量为j的背包里可以装下的最大体积
第二步:确定状态转移方程:枚举最后一次决策--第i个物品放还是不放;
放: dp[i][j] = dp[i-1][j-v[i]]+v[i];
不放:dp[i][j] = dp[i-1][j];

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int v;//输入体积
    int n;//输入物品个数
    while(cin>>v>>n)
    {
        int Item[30];//保存物品体积
        for(int i=1;i<=n;i++)
            cin>>Item[i];
        int dp[31][2001]={0};//前i个物体放入容量为j的背包总所能占用的最大体积
        for(int i=1;i<=n;i++)
            for(int j=1;j<=v;j++)
            {
                if(Item[i]>j){
                    dp[i][j] = dp[i-1][j]; //如果第i个物体容量比背包大,则不放
                }
                else{
                    dp[i][j] =max(dp[i-1][j],dp[i-1][j-Item[i]]+Item[i]); //状态转移方程
                }
            }
        cout<<dp[n][v]<<endl;
    }
}


价值背包

有N件物品和一个容量为V的背包。第i件物品的容量是c[i],价值是w[i],求解将哪些物体装入背包可使价值总和最大。

这里注意:要分情况恰装满或者小于等于背包容量(初始化不同)
第二种情况

#include<iostream>
#include<cstring>
using namespace std;
const int MaxN =105;
const int MaxM=105;

int main()
{
    int N;//行李箱的最大容量
    int M;//物体的个数
    int c[MaxM];//容量
    int v[MaxM];
    int dp[MaxN][MaxM];
    while(cin>>N>>M)
    {
        for(int i=1;i<=M;i++)
        {
            cin>>c[i];
        }

        for(int i=1;i<=M;i++)
        {
            cin>>v[i];
        }
        for(int i=0;i<=M;i++)
        {
            dp[i][0]=0;
        }
         for(int j=0;j<=N;j++)
        {
            dp[0][j] =0;
        }

        for(int i=1;i<=M;i++)
            for(int j=1;j<=N;j++)
            {
                if(c[i]>j) dp[i][j]=dp[i-1][j];
                else{
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-c[i]]+v[i]);
                }
            }
        cout<<dp[M][N];
    }
}

完全背包

将状态方程改下即可

#include<iostream>
#include<cstring>
using namespace std;
const int MaxN =105;
const int MaxM=105;

int main()
{
    int N;//行李箱的最大容量
    int M;//物体的个数
    int c[MaxM];//容量
    int v[MaxM];
    int dp[MaxN][MaxM];
    while(cin>>N>>M)
    {
        for(int i=1;i<=M;i++)
        {
            cin>>c[i];
        }

        for(int i=1;i<=M;i++)
        {
            cin>>v[i];
        }
        for(int i=0;i<=M;i++)
        {
            dp[i][0]=0;
        }
         for(int j=0;j<=N;j++)
        {
            dp[0][j] =0;
        }

        for(int i=1;i<=M;i++)
            for(int j=1;j<=N;j++)
            {
                if(c[i]>j) dp[i][j]=dp[i-1][j];
                else{
                    dp[i][j] = max(dp[i-1][j],dp[i][j-c[i]]+v[i]);
                }
            }

        cout<<dp[M][N];
    }
}

问题待解决

恰好装满的情况未能弄清楚

相关文章

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    0-1背包问题 问题 n个物体,它们各自有重量和价值,给定一个有容量的背包,如何让背包里装入的物体价值总和最大? ...

  • 背包问题

    问题描述 假如有一个能装下4磅的背包,如何从下列商品列表中选择商品填充背包,使价值达到最大: 动态规划 要解决背包...

  • 背包问题

    (1)0-1背包容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2...

  • 背包问题

  • 背包问题

    01背包(物品只有一个) 有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物...

  • 背包问题

    1. 01背包 状态说明:背包体积为v,物品个数为n,f[n,v]表示前n件物品加入背包的最大价值。c_i,w_i...

  • 背包问题

    01背包 优化空间复杂度,变为一维; 外循环依然是n从1->N, 注意内循环 v是从V->0,为什么内循环是V->...

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

网友评论

    本文标题:背包问题

    本文链接:https://www.haomeiwen.com/subject/nqqxyqtx.html