Bone Collector01背包

mac2022-06-30  27

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件物品,容器最大容积为n30 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 }

 

转载于:https://www.cnblogs.com/LK1994/archive/2013/05/02/3055091.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)