二維揹包,也是一種揹包問題。
二維揹包問題,主要就是說的揹包放置的物品,需要兩種代價才能實現,就像是兩個01揹包合成成了一個題目。
繼續拿我們oj上題目採藥三來說,給出鏈接:採藥3
之前做的採藥1用的是二維數組,一株是一維,另一維是時間,現在有承重和容積兩種限制,那麼我們就採用三維數組c[n][m][t],下一株都是跟上一株的同一狀態相比較。設定承重和容積爲w1[n]和w2[n],價值v[n]。
表因爲是三維,不好寫,所以不寫了。
得出表達式:
c[n][m][t] = max(c[n-1][m][t], c[n-1][m-w1[n]][t-w2[n]]+v[n])
這樣的話,根據上面這個式子,可以用二維數組來寫出我們的程序。
貼出代碼:
<span style="font-size:18px;">#include <stdio.h>
#define max(a, b) a>b?a:b
int w1[100], w2[100], v[100];
int c[101][101] = {0};
int main(){
int m, t, n, a;
scanf("%d %d %d", &m, &t, &n);
int i, j, k, l;
for(i=0; i<n; i++)
scanf("%d %d %d", &w1[i], &w2[i], &v[i]);
for(i=0; i<n; i++)
for(j=m; j>=0; j--)
for(k=t; k>=0; k--)
if(j>=w1[i] && k>=w2[i])
c[j][k] = max(c[j][k], c[j-w1[i]][k-w2[i]]+v[i]);
printf("%d\n", c[m][t]);
return 0;
}</span>