1. 程式人生 > >題解報告:hdu Bone Collector(01背包)

題解報告:hdu Bone Collector(01背包)

收集 骨骼 不同的 很多 AS 背包 std int 問題

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

問題描述

   許多年前,在泰迪的家鄉有一個叫做“骨頭收藏家”的男人。這個男人喜歡收集各種各樣的骨頭,比如狗的,牛的,他也去了墳墓... 骨頭收藏家有一個體積為V的大袋子,在收集行程中有很多骨頭,顯然,不同的骨骼具有不同的價值和不同的體積,現在給出每次骨頭在旅途中的價值,你能計算一下超出骨頭收集器可以獲得的最大總價值?

輸入

   第一行包含一個整數T,即個案數。 其次是T個案例,每個案例三行,第一行包含兩個整數N,V(N <= 1000,V <= 1000),表示骨骼的數量和他的包的體積。第二行包含N個代表每個骨骼值的整數。第三行包含N個整數,代表每個骨骼的體積。

輸出

   每行一個整數,代表總值的最大值(該數字將小於2^31)。

示例輸入

1

5 10

1 2 3 4 5

5 4 3 2 1

示例輸出

14

解題思路:簡單的01背包(dp)。

AC代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int value[1005],weight[1005],dp[1005];//dp數組始終記錄當前體積的最大價值
 4 int main()
 5 {
 6     int T,N,V;
 7     cin>>T;
 8     while(T--){
 9         cin>>N>>V;
10 for(int i=0;i<N;i++)cin>>value[i];//輸入價值 11 for(int i=0;i<N;i++)cin>>weight[i];//輸入體積 12 memset(dp,0,sizeof(dp));//初始化 13 for(int i=0;i<N;i++){ //個數 14 for(int j=V;j>=weight[i];j--) //01背包 15 dp[j]=max(dp[j],dp[j-weight[i]]+value[i]); //
比較放入i物體後的價值與不放之前的價值,記錄大的值 16 } 17 cout<<dp[V]<<endl;//輸出總體積的最大值 18 } 19 return 0; 20 }

題解報告:hdu Bone Collector(01背包)