zoukankan      html  css  js  c++  java
  • M

    M - 基础DP
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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 2 31).

    Sample Input

    1
    5 10
    1 2 3 4 5
    5 4 3 2 1

    Sample Output

    14

    //第一行代表有T个测试案例
    第二行 n,m 代表有 n 个物品,背包容量为 m 。接下来两行分别是 n 个物品的价值,体积

    //动态规划入门,看了很久才懂。
    我先用的递归做的 5696kb 452ms

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define MAX 1005
     5 
     6 int v[MAX];
     7 int w[MAX];
     8 int f[MAX][MAX];
     9 
    10 int max(int a,int b)
    11 {
    12     return a>b?a:b;
    13 }
    14 
    15 int dp(int n,int m)
    16 {
    17     if (f[n][m]>=0) return f[n][m];
    18 
    19     if (n==0) return 0;
    20 
    21     if (m<v[n])//fang bu liao
    22     {
    23         return dp(n-1,m);
    24     }
    25     else
    26     {
    27         f[n][m]=f[n-1][m];
    28         f[n][m]=max(dp(n-1,m),dp(n-1,m-v[n])+w[n]);
    29     }
    30     return f[n][m];
    31 }
    32 
    33 int main()
    34 {
    35     int i,t,n,m;
    36     scanf("%d",&t);
    37     while (t--)
    38     {
    39         scanf("%d%d",&n,&m);
    40         for (i=1;i<=n;i++)
    41             scanf("%d",&w[i]);
    42         for (i=1;i<=n;i++)
    43             scanf("%d",&v[i]);
    44 
    45         memset(f,-1,sizeof(f));
    46 
    47             printf("%d
    ",dp(n,m));
    48     }
    49     return 0;
    50 }
    View Code

    递推 5592kb 78ms

     
     1 #include <stdio.h>
     2 
     3 #define MAX 1005
     4 
     5 int v[MAX];
     6 int w[MAX];
     7 int f[MAX][MAX];
     8 
     9 int max(int a,int b)
    10 {
    11     return a>b?a:b;
    12 }
    13 
    14 int main()
    15 {
    16     int i,j,t,n,m;
    17     scanf("%d",&t);
    18     while (t--)
    19     {
    20         scanf("%d%d",&n,&m);
    21         for (i=1;i<=n;i++)
    22             scanf("%d",&w[i]);
    23         for (i=1;i<=n;i++)
    24             scanf("%d",&v[i]);
    25 
    26         for (j=0;j<=m;j++) f[0][j]=0;
    27 
    28         for (i=1;i<=n;i++)
    29             for (j=0;j<=m;j++)
    30             {
    31                 f[i][j]=f[i-1][j];
    32                 if (j>=v[i])
    33                     f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
    34             }
    35             printf("%d
    ",f[n][m]);
    36     }
    37     return 0;
    38 }
    View Code
    
    
    

    一维数组 1784kb 15ms

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define MAX 1005
     5 
     6 int v[MAX];
     7 int w[MAX];
     8 int f[MAX];
     9 
    10 int max(int a,int b)
    11 {
    12     return a>b?a:b;
    13 }
    14 
    15 int main()
    16 {
    17     int i,j,t,n,m;
    18     scanf("%d",&t);
    19     while (t--)
    20     {
    21         scanf("%d%d",&n,&m);
    22         for (i=1;i<=n;i++)
    23             scanf("%d",&w[i]);
    24         for (i=1;i<=n;i++)
    25             scanf("%d",&v[i]);
    26 
    27         memset(f,0,sizeof(f));
    28         for (i=1;i<=n;i++)
    29             for (j=m;j>=0;j--)
    30             {
    31                 if (j>=v[i])
    32                     f[j]=max(f[j],f[j-v[i]]+w[i]);
    33             }
    34             printf("%d
    ",f[m]);
    35     }
    36     return 0;
    37 }
    View Code
    
    
  • 相关阅读:
    php 文件下载 重命名
    [转载]北漂一族年终总结:在北京混必备的六大能力
    出去转了一转,便利店......
    来京第一天
    生活脚步,不停地走......
    键盘控制层的移动javascript
    离开告别...重新开始...
    夜未眠,三字诗......
    我喜欢这首歌......
    Foxmail邮件发不出去,都是Mcafee惹得祸
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/5731866.html
Copyright © 2011-2022 走看看