一開始看到這題就認爲應該用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 }