2016-4-25 完美世界-實習--小萌的包裹

一開始看到這題就認爲應該用dp作,先想到用二維,(表示處理到第i個物品時,前m個揹包所能裝的最大物品數)dp[m][i]=dp[m-1][i]+最後一個揹包用來裝第i個到n個物品所能得到的最大物品數,後面因爲對0,1 揹包不熟,加上這個dp方程思路都不怎麼清晰,而後沒寫了。ios

後面本身又想用三維dp來作,寫了個dp[i][m][v] 表示處理到第i個數時,前m個揹包,最後一個容量爲v時,所能裝入的最大物品數。又由於最後一維只表示最後一個揹包的狀態,而前面一些揹包的狀態沒考慮,因此又感受不行。後面,看到網上一我的寫了個三維DP,而後又想了想,其實,後面能夠考慮用兩個max 求最大值來表示,一個max來表示最後一個揹包的容積,另外一個max 來表示只有前m-1個揹包時所得到最大物品數。具體代碼以下:ide

 1 #include <cmath>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <memory>
 7 #include <string>
 8 #include <queue>
 9 #include <map>
10 #include <stdio.h>
11 #include <vector>
12 #include <stack>
13 #include <fstream>
14 using namespace std;
15 
16 int main()
17 {
18     int dp[25][25][25];
19     int n,t,m,a[25];
20     while(cin>>n>>t>>m)
21     {
22         for(int i=1;i<=n;i++)
23             cin>>a[i];
24         memset(dp,0,sizeof(dp));
25         for(int i=1;i<=m;++i) // 前i個揹包
26         {
27             for(int j=1;j<=n;++j) // 前j件物品
28             {
29                 for(int k=0;k<=t;++k) // 容量爲k
30                 {
31                     if(k-a[j]>=0) // 放入
32                     {
33                         dp[i][j][k]=max(max(dp[i][j-1][k],dp[i][j-1][k-a[j]]+1),dp[i-1][j][t]); // 放入當前揹包
34 
35                     }
36                     else // 丟棄
37                         dp[i][j][k]=max(max(dp[i][j-1][k],0),dp[i-1][j][t]);
38                     //cout<<i <<" 個揹包. "<<j<<" 件物品. "<<k<<" 容量  "<<dp[i][j][k]<<endl;
39                 }
40             }
41             //
42         }
43         cout<<dp[m][n][t]<<endl;
44     }
45     return 0;
46 }
View Code
相關文章
相關標籤/搜索