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就可以做出來)。
壹句話:多思考,再思考。
很久沒碰算法了。我沒有現成的代碼。這是我手寫的。請打分。