1. 程式人生 > 其它 >springboot配置不生效

springboot配置不生效

例六、 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(int
i=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