動態規劃-二維揹包(1)

二維揹包,也是一種揹包問題。

二維揹包問題,主要就是說的揹包放置的物品,需要兩種代價才能實現,就像是兩個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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章