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]);
    }
}
 
原文地址:https://www.cnblogs.com/anhuizhiye/p/3327025.html