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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用计算机程序快速得到9*9大小数独的解法

    利用计算机程序快速得到9*9大小数独的解法对于9∗99*99∗9大小的数独游戏,我们可以使用回溯法求得其正确的解,但是,一般的回溯法实现这个过程保证不了时间复杂度,所以我们可以利用二进制压缩的方法来优化其过程。具体思路如下:明确数独的约束:相同一行不能出现重复的数相同一列不能出现重复的数同一宫内不能出现重复的数定义row[i]row[i]row[i]数组代表,第i,ji,ji,j位置,在iii行哪些数被占用,用二进制111表示没有被占用,000表示被占用那么最开始row[i]row[i]row[i]=111111

    2025年8月20日
    1
  • getter和setter怎么用_python setter

    getter和setter怎么用_python setter有时候我们只知道一个对象的字段,我们想通过反射的方式将此字段赋值,可直接写反射又太浪费时间,还需要自己手动拼接方法名,而java为我们提供了一个很方便的类(PropertyDescriptor)来操作这一过程。使用很简单,直接看代码:代码importcom.pibgstar.demo.bean.User;importjava.beans.IntrospectionException…

    2022年10月1日
    1
  • 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop

    搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop转载自:https://www.imooc.com/article/17571网页可见区域高:document.body.clientHeight网页正文全文高:document.body.scrollHeight网页可见区域高(包括边线的高):document.body.offsetHeight网页被卷去的高:document.body.scrollTop屏幕分辨率高:window.screen…

    2022年7月24日
    15
  • strtok独到深刻的讲解「建议收藏」

    strtok独到深刻的讲解「建议收藏」strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一下实验环境是必要的,winxp+vc6.0,一个极端平民化的实验环境。本文中使用的源代码大部分来自于网络,我稍加修改作为例证。当然,本人水平有限,有不妥之处在所难免,各位见谅的同时不妨多做实验,以实验为证。strtok的

    2022年7月14日
    17
  • DLL文件反编译(附:工具下载链接)

    DLL文件反编译(附:工具下载链接)前几天写程序的时候电脑突然坏了,代码没有提交,已经更新过了,也就是说写的东西,除了DLL文件之外没别的东西了,代码全都没了,突然灵光一闪,想到了反编译。说干就干。百度上搜了下反编译工具,发现一款名叫“Reflector”的歪果反编译文件的效果不错,接下来,下载,为了方便大家,我直接放在百度云里面了:链接:https://pan.baidu.com/s/1PfxKxKp57pTYnSR3ThlOIg提取码:ohx2复制这段内容后打开百度网盘手机App,操作更方便哦下载下来之后,解压完是这样的:

    2025年7月4日
    18
  • C++Annoatation 02: More extensions to C , Some features of C++11

    C++Annoatation 02: More extensions to C , Some features of C++11

    2021年8月24日
    107

发表回复

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

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