zoukankan      html  css  js  c++  java
  • Bone Collector

    Bone Collector

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 3   Accepted Submission(s) : 1

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    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


    思路:简单的动态规划,0-1背包问题

    1,二维数组解法:
    #include<stdio.h>
    #include<string.h>
    int a[1001][1001],va[1001],vo[1001];
    int max(int x, int y)
    {
        return x>y?x:y;
    }
    
    int main()
    {
        int T,i,j,n,v;
        scanf("%d",&T);
        while(T--)
        {
            memset(a,0,sizeof(a));
            scanf("%d%d",&n,&v);
            for(i = 0;i < n;i ++)
                scanf("%d",&va[i]);
            for(i = 0;i < n;i ++)
                scanf("%d",&vo[i]);
            for(i = 0;i <= v;i ++)
            {
                for(j = 0;j < n;j ++)
                {
                    if(i>=vo[j])
                        a[i][j] = max(a[i][j-1],a[i-vo[j]][j-1]+va[j]);
                    else
                        a[i][j] = a[i][j-1];
                }
            }
            printf("%d
    ",a[v][n-1]);
        }
    }


    2,一维数组解法:
    #include<stdio.h>
    #include<string.h>
    int a[1001],va[1001],vo[1001];
    int max(int x, int y)
    {
        return x>y?x:y;
    }
    
    int main()
    {
        int T,i,j,n,v;
        scanf("%d",&T);
        while(T--)
        {
            memset(a,0,sizeof(a));
            scanf("%d%d",&n,&v);
            for(i = 1;i <= n;i ++)
                scanf("%d",&va[i]);
            for(i = 1;i <= n;i ++)
                scanf("%d",&vo[i]);
            for(i = 1;i <= n;i ++)
            {
                for(j = v;j >= 0;j --)
                {
                    if(j>=vo[i])
                        a[j] = max(a[j],a[j-vo[i]]+va[i]);
                    else
                        a[j] = a[j];
                }
            }
            printf("%d
    ",a[v]);
        }
    }
     
  • 相关阅读:
    dp,路径保存,最大公共上升子序列——ZOJ
    简单dp——HDU
    扫描线,线段树,离散化——HDU
    c++版本的opencv3.4.1里分类器输出值异常
    win10家庭版openssh连接远程服务器显示connetion reset
    生活感悟一
    Teradata简介
    kettle 无法正常启动问题
    kettle实现同构单表增量同步
    kettle数据库连接使用变量
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3327025.html
Copyright © 2011-2022 走看看