zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2019.9.5 Balanced Lineup
    0060-最小的四位数
    0059-乘积问题
    0058-简单的阶乘
    0057-简单的累加
    0056-简单的博弈
    神奇代码
    测评结果大百科
    0055-空气质量检测
    0054-软件版本号问题
  • 原文地址:https://www.cnblogs.com/LETTers/p/2461032.html
Copyright © 2011-2022 走看看