當前位置:編程學習大全網 - 編程語言 - 用C語言求解動態規劃的背包問題

用C語言求解動態規劃的背包問題

# include & ltstdio.h & gt

int max(int a,int b)

{

如果(a & gtb)返回a;

否則返回b;

}

int main()

{

//int max(int,int);

int n,m,I,j;

int data[101][2];

int f[101][101];

scanf("%d%d ",& ampn & amp;m);//n代表數字,m代表可以承載的最大重量。

for(I = 1;我& lt= n;i++)

{

scanf("%d%d ",& amp數據[i][0],& ampdata[I][1]);

}//我記得從第壹個開始的數組。看起來很好理解。沒有必要保存幾B的內存。

for(I = 0;我& lt= m;i++)f[0][I]= 0;

for(I = 0;我& lt= n;i++)f[I][0]= 0;

for(I = 1;我& lt= n;i++)

for(j = 1;j & lt= m;j++)

{

f[I][j]= 0;

if(j & gt;=data[i][0])

{

f[i][j]=max(f[i-1][j],f[I-1][j-data[I][0]]+data[I][1]);

//對於這壹項,要麽不選,要麽選,不選f[I-1][j];

//如果這裏選擇f[i-1][j-data[i][0]],j-data[i][0]是因為上壹次要選就要減掉j-data[i][0]的權重。

//來保存此項。

}

else f[I][j]= f[I-1][j];

}

printf("%d\n ",f[n][m]);

返回0;

}

那麽常見的背包問題就是多背包問題。每個物品可能有多個背包問題,可以預處理成壹般的背包問題,也就是把其中的幾個展開,很簡單,就不解釋了。當然,可以增加壹個維度。

還有完全背包問題。他的狀態轉移方程是f [i,j] = max (f [i-1] [j],f [i] [j-data [i]。v])。

他和01唯壹的區別就是在選擇的時候,不是f[i-1][j-data[i]。v]但是f[i][j-data[i]。v],讓妳自己選擇。如果妳是初學者,可能很難理解。慢慢來。事實上,這很好。我在開始的時候。

還有壹個背包,只需要加壹個維度,理解前面的性質就可以做出來,完全不用看狀態轉移方程(其實理解01就可以做出來)。

壹句話:多思考,再思考。

很久沒碰算法了。我沒有現成的代碼。這是我手寫的。請打分。

  • 上一篇:計算機考研為什麽分數更低百度貼吧
  • 下一篇:c++和java到底學哪壹個好?
  • copyright 2024編程學習大全網