zoukankan      html  css  js  c++  java
  • Bone Collector(01背包)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/N

    题目:

       

    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 2 31).
     

    Sample Input

    1
    5  10
    1  2  3  4  5
    5  4  3  2  1
     

    Sample Output

    14

    分析:

          将前i件物品放入容量为j的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么

    就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件

    物品放入容量为j的背包中”,价值为f[i-1][j];如果放第i件物品,那么问题就转化为“前i-1件物品放

    入剩下的容量为j-v[i]的背包中”,此时能获得的最大价值就是f[i-1][j-v[i]]再加上通过放入第i件物品获得的价值m[i] .

    #include<iostream> 
    #include<cstring>  
    using namespace std;
    int m[1005],v[1005];
    int f[1005][1005];
    int max(int  a,int b)
    {
    if(a>b) return a;
    else return b;
    }
    int main()
    {
       int t,n,i,j,M;
       cin>>t;
       while(t--)
       {
        cin>>n>>M;
        for(i=1;i<=n;i++)
          cin>>m[i];
        for(i=1;i<=n;i++)
          cin>>v[i];
         for(i=1;i<=n;i++)
             for(j=0;j<=M;j++)
             {
                f[i][j]=(i==1?0:f[i-1][j]);
                 if(j>=v[i]) 
                f[i][j]=max(f[i][j],f[i-1][j-v[i]]+m[i]);
                }
             cout<<f[n][M]<<endl;
       }
        return 0;
     }
  • 相关阅读:
    adb 连接时候不弹出授权对话框【转】
    Android设备adb授权的原理【转】
    JDK-Logger
    使用xpath时出现noDefClass的错误(找不到某个类)
    Netty系列之Netty 服务端创建
    windows 如何查看端口占用情况?
    解决Apache/PHP无法启动的问题
    多个mysql解决方法
    Qt 静态编译后的exe太大, 可以这样压缩.
    烈焰SWF解密
  • 原文地址:https://www.cnblogs.com/fenhong/p/4734870.html
Copyright © 2011-2022 走看看