动态规划-二维背包(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])

这样的话,根据上面这个式子,可以用二维数组来写出我们的程序。

贴出代码:

#include 
#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=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;
}


你可能感兴趣的:(ACM算法-动态规划)