背包九讲之五(二维费用的背包问题)
http://acm.fafu.edu.cn/problem.php?id=1499
1 /* 2 二维费用的背包问题是指:对于每件物品,具有两种不同的费用, 3 选择这件物品就必须付出这两种代价,每种代价都有可付出的最大值(背包容量) 4 问怎么选择物品才能得到最大价值.费用增加了一维,那么只需要状态增加一维就可以了、 5 dp[i][j][k] 前i件物品付出两种代价为j和k的最大价值 6 dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-a[i]][k-b[i]]); 7 根据背包的思想,可将状态压缩为二维的. 8 只不过是费用增加了一维,所以01背包,完全背包,多重完全背包的思想完全 9 可以用在这里 10 */ 11 #include <stdio.h> 12 #include <string.h> 13 int t[111],v[111],g[111]; 14 int dp[1111][111]; 15 int T,V,N; 16 inline int max(const int &a, const int &b) 17 { 18 return a < b ? b : a; 19 } 20 void zeroOnePack(int t,int v, int g) 21 { 22 int i,j; 23 for(i=T; i>=t; --i) 24 for(j=V; j>=v; --j) 25 dp[i][j] = max(dp[i][j],dp[i-t][j-v]+g); 26 } 27 int main() 28 { 29 int i; 30 while(scanf("%d%d%d",&T,&V,&N)!=EOF) 31 { 32 memset(dp,0,sizeof(dp)); 33 for(i=1; i<=N; ++i) 34 scanf("%d%d%d",&g[i],&t[i],&v[i]); 35 for(i=1; i<=N; ++i) 36 zeroOnePack(t[i],v[i],g[i]); 37 printf("%d\n",dp[T][V]); 38 } 39 40 return 0; 41 }
但是更多的时候是隐式地给出条件,比如n个物品最多取m个,那么第二维的费用便是个数。