原题链接 POJ 2184
题目大意
先给出 N 头奶牛(0<= N <= 100),每头牛都有一个聪明值Si,幽默值Fi。现在想从这些牛里面选出一些,让(聪明值总和TS+幽默值总和FS)最大,但是同时TS和FS又不能够为负值。
解题思路
这题可以看做是背包问题的变形。奶牛可以当做是放入背包的物品,奶牛的属性就是背包的重量和价值。
不过这里的Si和Fi都可能是负的,这样子我们dp数组的下标就无法表示了。所以我们要先把Si加上1000,把区间 -1000 <= Si <= 1000 挪到 0 <= Si <= 2000上来。我们用dp[i][j]表示前 i 头奶牛的聪明值的和为 j 时,(TS + TF)的最大值。注意这里的 j 并不是真的 TS,因为前 i 头奶牛里,我们可能选了 k 头奶牛,0 <= k <= i,每头奶牛的聪明值都加了1000,因此 j = TS + k * 1000;