• HDU 2602.Bone Collector-动态规划0-1背包


    Bone Collector

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


    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
     
     
     
    代码(一维数组):
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e5+10;
     4 int val[N],wei[N],dp[N];
     5 int main(){
     6     int t,n,m;
     7     scanf("%d",&t);
     8     while(t--){
     9             memset(val,0,sizeof(val));
    10             memset(wei,0,sizeof(wei));
    11             memset(dp,0,sizeof(dp));
    12         scanf("%d%d",&n,&m);
    13         for(int i=0;i<n;i++)
    14             scanf("%d",&val[i]);
    15         for(int i=0;i<n;i++)
    16             scanf("%d",&wei[i]);
    17         for(int i=0;i<n;i++){
    18             for(int j=m;j>=wei[i];j--){
    19                 dp[j]=max(dp[j],dp[j-wei[i]]+val[i]);
    20             }
    21         }
    22         printf("%d
    ",dp[m]);
    23     }
    24     return 0;
    25 }

    代码(二维数组):

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e3+10;
     4 int val[N],wei[N],dp[N][N];
     5 int main(){
     6     int t,n,m;
     7     scanf("%d",&t);
     8     while(t--){
     9         memset(dp,0,sizeof(dp));
    10         scanf("%d%d",&n,&m);
    11         for(int i=1;i<=n;i++)
    12             scanf("%d",&val[i]);
    13         for(int i=1;i<=n;i++)
    14             scanf("%d",&wei[i]);
    15         for(int i=1;i<=n;i++){
    16             for(int j=0;j<=m;j++){
    17                 if(wei[i]<=j)dp[i][j]=max(dp[i-1][j],dp[i-1][j-wei[i]]+val[i]);
    18                 else dp[i][j]=dp[i-1][j];
    19             }
    20         }
    21         printf("%d
    ",dp[n][m]);
    22     }
    23     return 0;
    24 }
  • 相关阅读:
    华为云DevCloud为开发者提供高效智能的可信开发环境
    【HC资料合集】2019华为全联接大会主题资料一站式汇总,免费下载!
    在modelarts上部署mask-rcnn模型
    独立物理机和虚拟机比较有什么优势?
    .Net Core下使用MQTT协议直连IoT平台
    解惑Python模块学习,该如何着手操作...
    sar命令,linux中最为全面的性能分析工具之一
    窥探日志的秘密
    Debian 如何使用测试版更新软件包到最新的版本
    如何使用vsphere client 克隆虚拟机
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9741042.html
Copyright © 2020-2023  润新知