zoukankan      html  css  js  c++  java
  • 终于入手了01背包问题!!


    对一个二维数组c[i][j] i表示放入背包中物体的个数 j表示目前剩余空间量 c表示目前的最大价值 (w[],v[]分别表示每个物品的重量 价值)

    基本的动态规划问题 用一个二维数组进行动态填表
    动态规划的核心是将一个问题分解成若干个子问题 并对子问题进行当前状态的最优解的问题
    对01背包问题每个子问题就是在已经满足此时价值最大的情况下 对是否加入下一个物品进行取决
    c[i][j]=max(c[i-1][j],c[i-1][j-w[i]+v[i]);

    01背包的二维填表问题实际就是一个递推问题 首先将第一行的(即c[0])初始化 然后对j++ i++逐一的填表 得出结果
    附上ac代码!!

    #include<stdio.h>
    int max(int x,int y)
    {
     if(x>y)
     return x;
     else
     return y;
    }
    int main()
    {
     int n,i,j,sum[1010][1010],t,c,v[1020],x[1020];
     scanf("%d",&t);
     while(t--)
     {
            for(i=0;i<=1001;i++)
            sum[0][i]=0;
      scanf("%d %d",&n,&c);
      for(i=1;i<=n;i++)
      {
       scanf("%d",&v[i]);
      }
      for(i=1;i<=n;i++)
      {
       scanf("%d",&x[i]);
      }
      for(i=1;i<=n;i++)
      {
       for(j=1;j<=c;j++)
       {
        if(j<x[i])
        sum[i][j]=sum[i-1][j];
        else
        sum[i][j]=max(sum[i-1][j],sum[i-1][j-x[i]]+v[i]);
       }
      }
      printf("%d\n",sum[n][c]);
     }
     return 0;
    }
    杭电oj 2602题
    对于一维的还在理解当中。。。 吃饭吃饭!!

  • 相关阅读:
    使用xtrabackup对MySQL进行备份和恢复
    魔棒工具RegionGrow算法简介
    编程之美扫雷篇
    从繁体字到书法
    谈读书如何才能提升你的工作能力
    魔兽争霸拼图照片一张
    做你心目中的达文西
    六一儿童节的礼物那些游戏中你不知道的玩法
    DIY手工制作Rhombicuboctahedron
    ul样式与jquery1.4.1冲突
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5259079.html
Copyright © 2011-2022 走看看