zoukankan      html  css  js  c++  java
  • 杭电 2602

    Bone Collector

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 29109    Accepted Submission(s): 11898


    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 ?



     

    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 231).
     

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

    Sample Output
    14
     

    Author
    Teddy
     

    Source
     
    这是 01 背包问题 01 背包问题用到了递推的思想。而且用到了分治
    将大问题转化为可以easy解决的,小问题。从小问题来得到答案的思想
    大致思路例如以下:
    c[i][v]表示前i-1件物品恰放入一个质量为m的背包能够取到最大价值。若仅仅考虑第i件物品的话,那么有两种情况。就是放,与不放,要是放的话,那么问题就转化为“将前n-1件物品放入剩下的容量为m-w[i]的背包中,此时获得的最大价值就是c[i-1][m-w[i]]再加上最后放进去的第i件的物品所获得价值p[i];要是不放的话。问题就变成:”将前n-1件物品放入容量为j的背包中。此时获得的最大价值就是c[i-1][m];然后题上一般有物品的数量,及对应的价值,通过两个for循环就好了。最后的最大价值就是c[n][m];
    代码例如以下:
    #include<stdio.h>
    #include<string.h>
    int dp[1010][1010],val[1010],vol[1010];
    int main()
    {
     int n,i,j,v,t;
     scanf("%d",&t);
     while(t--)
     {
      scanf("%d%d",&n,&v);
      for(i=1;i<=n;i++)
      scanf("%d",&val[i]);
      for(j=1;j<=n;j++)
      scanf("%d",&vol[j]);
      memset(dp,0,sizeof(dp));
      for(i=1;i<=n;i++)
      for(j=0;j<=v;j++)//题上有个陷阱。就是将没有体积可是有价值的 骨头考虑了进去
      {
       if(vol[i]<=j&&dp[i-1][j]<dp[i-1][j-vol[i]]+val[i])
       dp[i][j]=dp[i-1][j-vol[i]]+val[i];//放进去的情况
       else
       dp[i][j]=dp[i-1][j];//不放的情况
      }
      printf("%d ",dp[n][v]);
     }
     return 0;
    }
  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5055232.html
Copyright © 2011-2022 走看看