• Bone Collector 01背包


    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 ?
     

    输入

     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.

    输出

     One integer per line representing the maximum of the total value (this number will be less than 231).
     

    示例输入

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

    示例输出

    14
     1 #include<stdio.h>
     2 #include<string.h>
     3 int c[1100][1100],p[1100],w[1100];
    //c[i][j]表示前i件物品恰好放入容积为j的背包获得的价值
    4 int knaspack(int m, int n) 5 { 6 int i, j; 7 memset(c,0,sizeof(c)); 8 for(i = 1; i < m+1; i++) 9 for(j = 1; j< n+1; j++) 10 { //如果第i件物品的体积小于容积j时,可包含两种情况:
    (1)物品i放入背包,前i-1件物品的体积为j-w[i],所以c[i][j]=c[i-1][j-w[i]]+p[i];
    (2)物品i不放入背包中,则c[i][j] = c[i-1][j];
    11 if(w[i] <= j) 12 { 13 if(c[i-1][j-w[i]]+p[i] > c[i-1][j]) 14 c[i][j] = c[i-1][j-w[i]] + p[i]; 15 else c[i][j] = c[i-1][j]; 16 } 17 else c[i][j] = c[i-1][j]; 18 } 19 return c[m][n]; 20 } 21 int main () 22 { 23 int t,i,m,n; 24 scanf("%d",&t); 25 26 27 while(t--) 28 { 29 scanf("%d %d",&m, &n); //有m件物品,容器最大容积为n
    30 for(i = 1; i <= m; i++) 31 scanf("%d",&p[i]); //物品的价值
    32 for(i = 1; i<= m; i++) 33 scanf("%d",&w[i]); //物品的体积。
    34 printf("%d\n",knaspack(m,n)); 35 } 36 return 0; 37 }

     也可以用一位数组

     1 #include<stdio.h>
     2 #include<string.h>
     3 int p[1100],w[1100],dp[1100];
     4 int main ()
     5 {
     6     int n,m,t;
     7     scanf("%d",&t);
     8     while(t--)
     9     {
    10         scanf("%d %d",&n,&m);
    11         for(int i = 0; i < n; i++)
    12             scanf("%d",&p[i]);
    13         for(int i = 0; i < n; i++)
    14             scanf("%d",&w[i]);
    15         memset(dp,0,sizeof(dp));
    16         for(int i = 0; i < n; i++)
    17             for(int j = m;j >= w[i]; j--)//体积按倒序
    18                 if(dp[j-w[i]]+p[i] > dp[j])
    19                     dp[j] = dp[j-w[i]]+p[i];
    20         printf("%d\n",dp[m]);
    21     }
    22     return 0;
    23 
    24 }
  • 相关阅读:
    GridView Footer页脚统计实现多行
    Windows cmd 启动 tomcat 中文乱码问题
    git
    CentOS 的 dnf 命令
    不知道是否是wcf 的一个bug
    图像卷积与滤波的一些知识点
    Phaser开源2d引擎 javascript/html5游戏框架
    关于Ldoc
    自写vim插件ldoc.vim,提供智能的lua注释代码补全
    svn diff 使用 vimdiff 作为比较差异工具
  • 原文地址:https://www.cnblogs.com/LK1994/p/3055091.html
Copyright © 2020-2023  润新知