Bone Collector

http://acm.hdu.edu.cn/showproblem.php?pid=2602

Bone Collector 递归做法

 

  
  
  
  
  1. //Bone Collector   递归做法  
  2. #include<stdio.h>  
  3. #define N 1005  
  4. #define V 1005  
  5. int c[N][V];  
  6. int value[N];  
  7. int size[N];  
  8. int knapsack(int n, int volume)  
  9. {  
  10.     int temp1,temp2;  
  11.     if (n <= 0 || volume < 0)  
  12.         return 0;  
  13.     if (c[n][volume] != -1)   //已经计算过c[n][volum],就直接返回  
  14.         return c[n][volume];  
  15.     temp1 = knapsack(n - 1, volume);  //第n个不装进包里  
  16.     if (volume < size[n])  
  17.         temp2 = -1;   //第n个的体积比剩下的要大,装不进去  
  18.     else 
  19.         temp2 = knapsack(n - 1, volume - size[n]) + value[n];   //将第n个装进包里,同时其体积也变为volume-size[n].继续递归  
  20.     if (temp1 > temp2)  
  21.         c[n][volume] = temp1;  
  22.     else 
  23.         c[n][volume] = temp2;  
  24.     return c[n][volume];  
  25. }  
  26.  
  27. void main()  
  28. {  
  29.     int t;  
  30.     int n,v;  
  31.     int temp, i, j;  
  32. //  freopen("input.txt", "r", stdin);  
  33.     scanf("%d", &t);  
  34.     while (t--)  
  35.     {  
  36.         scanf("%d%d", &n, &v);  
  37.         for (i = 1; i <= n; i++)  
  38.         {  
  39.             scanf("%d", &value[i]);  
  40.         }  
  41.         for (i = 1; i <= n; i++)  
  42.         {  
  43.             scanf("%d", &size[i]);  
  44.         }  
  45.         //初始化  
  46.         for (i = 1; i <= n; i++)  
  47.         {  
  48.             for (j = 0; j <= v; j++)  
  49.             {  
  50.                 c[i][j] = -1;  
  51.             }  
  52.         }  
  53.         temp = knapsack(n, v);  
  54.         printf("%d\n",temp);  
  55.     }  
  56. }  

 

你可能感兴趣的:(职场,ACM,休闲)