Bone Collector——HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)

Bone Collector——HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)

大家好,又见面了,我是全栈君。

Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …

The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?


Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)


 


Input
The first line contain a integer T , the number of cases.

Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
 


Output
One integer per line representing the maximum of the total value (this number will be less than 2
31).
 


Sample Input
   
   
1 5 10 1 2 3 4 5 5 4 3 2 1

 


Sample Output
   
   
14

 
先输入一个t,代表有t个样例。然后输入n和v,n代表有多少骨头。v代表背包体积,每样东西仅仅有一个,也就是说仅仅能取一次,刚開始看这道题的时候全然不知道怎么做。感觉会非常麻烦的样子,学长是作为例题给我们讲的。刚開始有点头绪,但详细还是全然不懂。后来自己专门刷这方面的专题。还算理解的比較好。动态规划的思想得要理解好,这题是用空间换时间。过程中会产生大量之间数据,嗯,就是这样。好了,回到这道题。我们用一维数组来存储数据,可是有些pdf文档比方背包九讲就是用二维数组来解说,都能够的。
如今进入正题:输入前面讲过了,如今讲核心代码
for(i=1;i<=n;i++)
   for(j=v;j>=c[i];j--)
        liu[j]=max(liu[j],liu[j-c[i]]+w[i]);
            
           

这三行就是核心。就像背包九讲里面说的,这个状态转移方程很重要,一定要理解,它联系了上一个状态和这一个状态,所以叫做状态转移方程!

!!!

!!

为了更加清楚描写叙述执行过程中数组每一个值的详细变化,我在这里加了几行代码:
for(i=1;i<=n;i++)
        {
            for(j=v;j>=c[i];j--)
            {
                liu[j]=max(liu[j],liu[j-c[i]]+w[i]);
            }
            for(k=1;k<=v;k++)
                printf("%d ",liu[k]);
            printf("\n");
        }

我们以题目给的数据为例,执行结果例如以下:

Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)

Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)

从图中我们能够看出(结合上面的代码),程序循环五次,每次循环的结果都在动态变化。假设还不能理解,建议自己在草稿子上模拟i=1。i=2的时候数组变化的情况,就会非常好理解了。动态规划给我的感觉就是代码非常短,可是理解之后就非常easy了!!!

!!!

好了。讲完了,近期在做dp专题,会不定时更新做题的心得还有题解,大家一起学习。
以下贴下AC代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
    int i,j,k;
    int t,n,m,v;
    int liu[1006],c[1006],w[1006];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&v);
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&c[i]);
        memset(liu,0,sizeof(liu));
        for(i=1;i<=n;i++)
        {
            for(j=v;j>=c[i];j--)
            {
                liu[j]=max(liu[j],liu[j-c[i]]+w[i]);
            }
            for(k=1;k<=v;k++)
                printf("%d ",liu[k]);
            printf("\n");
        }
        printf("%d\n",liu[v]);
    }
    return 0;
}

写代码能力有限,如有编程爱好者发现bug,还请指出,不胜感激!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115497.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Django(42)DRF安装与使用

    Django(42)DRF安装与使用DRF介绍DRF是DjangoRestFramework单词的简写,是在Django框架中实现RestfulAPI的一个插件,使用他可以非常方便的实现接口数据的返回。Django中也可以使用J

    2022年7月31日
  • Linux安装gcc的四种方法「建议收藏」

    Linux安装gcc的四种方法「建议收藏」相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装。常见的有以下几种安装方法 源码安装 rpm包安装 yum安装(RedHat、CentOS) apt-get安装(debian,ubuntu) 源码安装以安装gcc为例,登陆https://gcc.gnu.org/,下载自己想要的版本的gcc安装包上传gcc-4.1.2.tar.gz到Linux服务器任意目录,解压解压目录执行shell命令./configurat.

    2022年5月26日
  • mle与map_normal map

    mle与map_normal map摘要本文是关于MLE(最大似然估计)与MAP(最大后验概率)的一些自己学习的心得.(本文的重点在于对比MLE和MAP)正文1.MLE(最大似然估计)MLE简单的理解可以这样:假设我们手上有一批数据(样本),而且我们假设这些数据(样本)服从某个分布(模型已知),但是参数未知.这个时候,我们希望对这个参数进行估计,而MLE的思想就是找到一个参数值,使得每条样本出现的概率最…

    2022年10月31日
  • 带通滤波器设计要注意采样率

    带通滤波器设计要注意采样率设计为采样频率600M,中心频率140M,带宽2M,Fs_org=140e6;Fs=Fs_org;T=1/Fs;%600/140=4.28,约600M采样率,t1=[0:T/4.28:1000*T];%原先错误代码,几乎就没有滤波%t1=[0:T/200:1000*T];%错误在于采样率远远大于600Mp=3*sin

    2022年5月27日
  • bigtable是什么_BigTable

    bigtable是什么_BigTableBigtable是一个用来管理结构化数据的分布式存储系统,具有很好的伸缩性,能够在几千台应用服务器上处理PB数量级数据。谷歌有许多项目都把数据存储在Bigtable中,包括webindexing,G

    2022年8月3日
  • 卷积神经网络CNN算法原理「建议收藏」

    卷积神经网络CNN算法原理「建议收藏」写在前面在上一篇【Deeplearning】卷积神经网络CNN结构中我们简单地介绍了CNN的结构。接下来我们看看这种结构的CNN模型是怎么运行的,包括CNN的前向传播和反向传播算法。1.CNN前向传播算法(1)输入层前向传播到卷积层输入层的前向传播是CNN前向传播算法的第一步。一般输入层对应的都是卷积层,因此我们标题是输入层前向传播到卷积层。我们这里还是以图像识别为例。先考虑…

    2022年9月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号