LETTers第五场-Bone Collector-解题报告

题目描述:

    有一个爱收集骨头(不良癖好)的家伙,他有一个背包,容积是V。现在有n块骨头,每块骨头有两个属性:体积volume和价值value。问他能够收集的骨头的价值之和最大是多少。

题面建模:

    简单背包问题。

    背包已用容积是j时,dp[j]=max(dp[j],dp[j-volumek]+valuek)。

    转移方程:dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0];

解题要点:

    注意边界的处理。

时空开销分析:

    空间复杂度:O(n)。

    时间复杂度:O(n^2)。

特别说明:

   无。

程序:

#include <stdio.h>
#include <string.h>
int bone[1010][2];
int dp[1010];
int main()
{
    int n,v,t,max,i,j;
    scanf("%d",&t);
    while(t--)
    {
        memset(bone,0,sizeof(bone));
        memset(dp,0,sizeof(dp));
        scanf("%d %d",&n,&v);
        for(i=0;i<2*n;i++)
            scanf("%d",bone[i%n]+i/n);
        for(i=0;i<n;i++)
            for(j=v;j-bone[i][1]>=0;j--)
                dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0];
        printf("%d\n",dp[v]);
    }
    return 1;
}

 

posted @ 2012-04-21 09:56  LETTers  阅读(200)  评论(0编辑  收藏  举报