【菜鸟er】动态规划_01背包

原创 2018年04月17日 18:01:47
#include <bits/stdc++.h>
#define MAX_N 1000
using namespace std;

int v[MAX_N],w[MAX_N];
int dp[100][100];
int n;
int wmax,vmax;

int main()
{
    //输入
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>w[i]>>v[i];
    }
    cin>>wmax;
    /*确定子问题:
        目的是得到最大价值,操作是要不要把第i件物品放到背包中?
    */
    /*确定dp[][]含义:
        dp[i][j]:   i:前i件物品参与了操作;
                    j:体积为j的背包;
                    dp[][]:在ij情况下的最大价值
                    ==:前i件中若干个物品放入体积为j的背包中的最大价值。

    */
    /*调整初始状态:(边界处理)
        x为任意有效值
        dp[0][x] = 0; //前0个物品放入最大支持x的背包中总价值永远是0
        dp[x][0] = 0; //背包大小为0,总价值永远为0;
    */
    /*最激动人心的地方:状态转移方程的确定
        1.同调整初始状态
        2.
            如果:背包体积j小于前i个物体之和
                背包装不下第i个物体了,此时总价值仍然为j-1时的价值
            否则:{
                //为了体积V的背包中物体总价值最大化,
                //第i件应该放入背包中吗?

                max(不放第i件,放第i件但是有空间减小的代价)
                //正是因为空间减小了,才能找到以前的值,才能比较

            }

            代码实现:
            if( j < w[i] ){
                f[i][j] = f[i-1][j];
            }
            else {
                f[i][j] = max( f[i-1][j] , f[i-1][j-w[i]]+v[i] );
            }

    */

    //刚出生哦
    /*//初始化的时候已经全部为0,不用再次操作
    for(int i = 0;i<n;i++){
        dp[i][0]=0;
        dp[0][i]=0;
    }*/
    //人家dp超简单的
    for(int i = 0;i<n;i++){
        for(int j = 0;j<=wmax;j++){
            if( j<w[i] ){
                dp[i+1][j] = dp[i][j];
            }
            else{
                dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]);
            }

        }

    }
    //输出记忆化数组,这里为了输出多一点数据
    int print_max = wmax>n ? wmax+1 : n+1;
    for(int i = 0;i<print_max;i++){
        for(int j = 0;j<print_max;j++)
            cout<<dp[i][j]<<" ";
        cout<<endl;
    }

    cout<<dp[n][wmax]<<endl;

    //拓展:如果实现输出选择哪一个,把max()函数展开成一个if()即可;
    return 0;
}
/**
n个物品,重量用w表示,价值用v表示,
从中挑选总重量不大于wmax的物品,
求能挑出的最大值vmax;
*/
/*
data:
4
2 3
1 2
3 4
2 2
5
print:
7
*/

【软考】动态规划之01背包问题

最近学习软考,其中算法这遇到01背包问题,经过一番探索,终于通过资料来了解了一些,有了一些头绪,下面咱们一起看看学习下: 首先解释下什么是01背包问题:给定一组共n个物品,每种物品都有自己...
  • z15732621582
  • z15732621582
  • 2016-10-08 16:01:06
  • 797

[动态规划] 01背包与完全背包

01背包(每种物品的状态为选择或不选择,最多只能选1件): 1.传统的二维数组,第i件物品的重量为w[i],价值为v[i] dp[i][j]保存的是选择前i件物品(每一件物品的状态为选与不选),在...
  • sr19930829
  • sr19930829
  • 2014-11-08 09:40:57
  • 2349

动态规划01背包与完全背包的C语言实现

01背包是基础的背包问题,即容量为v的背包, 给你n件物品, 每件物品只有一件, 每件物品所占体积vi, 价值wi已知,求此背包所能容纳的前提下,让在其中物品价值最大。 此问题状态方程为发f[i][v...
  • shadowam
  • shadowam
  • 2017-02-10 11:17:05
  • 1307

动态规划01背包

  • 2014年08月15日 13:00
  • 347B
  • 下载

01背包 Java 动态规划

01背包  动态规划
  • u011980994
  • u011980994
  • 2014-05-23 11:46:26
  • 1225

数字组合-动态规划(01背包)-openjudge

总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如: n=5,5个数分别为1,2,3,4,5,t=5; 那么...
  • shangyanaf
  • shangyanaf
  • 2017-03-20 20:23:06
  • 250

DP——01背包问题使用迭代和动态规划(超详细——小白入门)

假设我是一个小偷,到达某个地方抢劫,并且没有人在家。 我为了放置物品而拿的麻袋最多可以承重5公斤。我要偷东西最大利润是多少?(PS纯属虚构)...
  • jushang0235
  • jushang0235
  • 2017-12-19 13:57:40
  • 687

01背包算法 动态规划(c++实现)

0-1背包问题:给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。 问应如何选择装入背包的物品,使得装入背包中的物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两种选...
  • catkint
  • catkint
  • 2016-03-29 21:59:18
  • 4180

动态规划_01背包问题_Java实现

什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案。...
  • ljmingcom304
  • ljmingcom304
  • 2015-12-16 15:11:44
  • 6342

从01背包学习贪心算法和动态规划

从01背包学习贪心算法和动态规划: 算法的思路其实很大程度上都是相通的,比如在提升算法运行时间的不断探索中,我们用分治的思想来将一个大问题分解为很多小问题进行求解,并且这些子问题与原问题的结构是一样...
  • u014449866
  • u014449866
  • 2015-05-01 21:31:36
  • 2345
收藏助手
不良信息举报
您举报文章:【菜鸟er】动态规划_01背包
举报原因:
原因补充:

(最多只允许输入30个字)