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

    Bone Collector

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


    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
     
    01背包模板题
    /*
        Accepted    2602    78MS    5360K    552 B    G++
    */
    #include"cstdio"
    #include"cstring"
    #include"algorithm"
    using namespace std;
    const int MAXN=1005;
    int dp[MAXN][MAXN];
    int n,W;
    int v[MAXN],w[MAXN];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&W);
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)    scanf("%d",&v[i]);
            for(int i=0;i<n;i++)    scanf("%d",&w[i]);
            
            for(int i=0;i<n;i++)
                for(int j=0;j<=W;j++)
                    if(j<w[i])    dp[i+1][j]=dp[i][j];
                    else dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
        
            printf("%d
    ",dp[n][W]);
        }
        
        return 0;
    }

     贴一个记忆化搜索

    /*
        Accepted    2602    327MS    5432K    613 B    G++
    */
    #include"cstdio"
    #include"cstring"
    #include"algorithm"
    using namespace std;
    const int MAXN=1005;
    int dp[MAXN][MAXN];
    int n,W;
    int v[MAXN],w[MAXN];
    int dfs(int i,int wei)
    {
        if(dp[i][wei])    return dp[i][wei];
        if(i==n)    return 0;
        int res;
        if(wei>=w[i])    res=max(dfs(i+1,wei-w[i])+v[i],dfs(i+1,wei));
        else    res=dfs(i+1,wei);
        return dp[i][wei]=res;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&W);
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)    scanf("%d",&v[i]);
            for(int i=0;i<n;i++)    scanf("%d",&w[i]);
            printf("%d
    ",dfs(0,W));
        }
        
        return 0;
    }
  • 相关阅读:
    UIButton和UIImageView的区别
    大道至简第八章读后感
    简单登录界面
    大道至简第七章读后感
    计算成绩代码
    大道至简第六章读后感
    产生随机数代码
    大道至简第五章读后感
    计算成绩算法
    加密算法
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5185444.html
Copyright © 2011-2022 走看看