• 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 }
  • 相关阅读:
    客户端组建调用
    串口开发
    C/C++,系统知识考点
    API进程线程函数
    做WEB2.0网站可以参考的十九条规则
    javascript中动态添加事件!!
    常用正则表达式收集!
    CuteChat for Community Server 2.0 beta 3!
    发现一个下载.Text Skin 的好网站.
    如何控制Linux终端打印字符颜色和位置
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9741042.html
Copyright © 2020-2023  润新知