springboot配置不生效
阿新 • • 發佈:2021-12-17
例六、 Charm Bracelet 0-1揹包問題(POJ3624)
有N件物品和一個容積為M的揹包。第i件物品的體積 w[i],價值是d[i]。求解將哪些物品裝入揹包可使價值總 和最大。每種物品只有一件,可以選擇放或者不放 (N<=3500,M <= 13000)。
21
0-1揹包問題(POJ3624)
用 F[i][j] 表示取前i種物品,使它們總體積不超過j的最優 取法取得的價值總和。要求F[N][M]
邊界:if (w[1] <= j)
F[1][j] = d[1];
else
F[1][j] = 0;
22
0-1揹包問題(POJ3624)
用 F[i][j] 表示取前i種物品,使它們總體積不超過j的最優 取法取得的價值總和
遞推: F[i][j] = max(F[i-1][j],F[i-1][j-w[i]]+d[i])
取或不取第 i種物品,兩者選優 (j-w[i] >= 0才有第二項)
23
0-1揹包問題(POJ3624)
F[i][j] = max(F[i-1][j],F[i-1][j-w[i]]+d[i])
本題如用記憶型遞迴,需要一個很大的二維陣列,會 超記憶體。注意到這個二維陣列的下一行的值,只用到了 上一行的正上方及左邊的值,因此可用滾動陣列的思想 ,只要一行即可。即可以用一維陣列,用“人人為我” 遞推型動歸實現。
遞迴:
#include <iostream> using namespace std; int W[10]; int D[10]; int F(int i,int j){ if(i==1&&W[1]<=j) return D[1]; else if(i==1)return 0; if(j-W[i]>=0) return max(F(i-1,j),F(i-1,j-W[i]) +D[i]);else{ return F(i-1,j); } } int main(){ for(inti=1;i<=3;i++) { cin>>W[i]; } for(int j=1;j<=3;j++) cin>>D[j]; cout<<F(3,40); }
遞推:節省空間
#include <iostream> using namespace std; int w[10]; int n; int j; int d[10]; int F[100];//滾動陣列 int main(){ cin>>n; cin>>j; for(int i=1;i<=n;i++){ cin>>w[i]; } for(int i=1;i<=n;i++){ cin>>d[i]; } for(int k=0;k<=j;k++) { if(w[1]<=k) F[k]=d[1]; else F[k]=0; } int temp=0; for(int i=2;i<=n;i++)//狀態只用到正上方和左側,所以從最右側開始遞推 { for(int k=j;k>=0;k--) { if(k>=w[i]) { temp=max(F[k],F[k-w[i]]+d[i]); F[k]=temp; } } cout<<F[j]; }
本文來自部落格園,作者:坤k,轉載請註明原文連結:https://www.cnblogs.com/fukunwang/p/15722405.html