POJ 2184 Cow Exhibition(DP)

思路:以S作为容量,T最为价值,就转化为01背包,然后由于S有负数,所以可以把值扩大10W,就都是正的,然后滚动数组的时候要根据s是正是负去决定滚的方向


代码:

#include 
#include 
#include 
using namespace std;

const int N = 200005;
const int INF = 0x3f3f3f3f;

int n, dp[N];

int main() {
	while (~scanf("%d", &n)) {
 		int s, t;
 		for (int i = 0; i <= 200000; i++) dp[i] = -INF;
 		dp[100000] = 0;
   		for (int i = 0; i < n; i++) {
   			scanf("%d%d", &s, &t);
   			if (s >= 0) {
			   	for (int j = 200000; j - s >= 0; j--) {
   					if (dp[j - s] == -INF) continue;
   					dp[j] = max(dp[j], dp[j - s] + t);
  				}
			} else {
				for (int j = 0; j - s <= 200000; j++) {
   					if (dp[j - s] == -INF) continue;
   					dp[j] = max(dp[j], dp[j - s] + t);
  				}
   			}
   		}
   		int ans = 0;
   		for (int i = 100000; i <= 200000; i++) {
   			if (dp[i] >= 0) {
  				ans = max(ans, i + dp[i] - 100000);
			}
     	}
     	printf("%d\n", ans);
  	}	
	return 0;
}


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