TYVJ 1089 smrtfun 解题报告

  超猥琐的题目,该怎么说,用a做01背包的体积,b做价值,然后pascal有一个很好的机制,可以使用负数做下标,但是C没有,于是乎就像到了指针,具体实现机制看代码吧,然后就是还有一个,初始状态f[0]=0,f[i] = -∞,然后要维护DP的界,代码如下:

#include <stdio.h>
#include <stdlib.h>
int a[100], b[100];
int f_[200001];
int (*f);
int ans;

int main(int argc, char **argv)
{
	int n;
	int i, j;
	int max = 0, min = 0;
	scanf("%d", &n);
	f = &f_[100000];
	for(i = 0; i < n; i++){
		scanf("%d%d", &a[i], &b[i]);
		if(a[i] > 0){
			max += a[i];
		}else{
			min += a[i];
		}
	}
	for(i = min; i <= max; i++){
		f[i] = -1000001;
	}
	f[0] = 0;
	max = 0, min = 0;
	for(i = 0; i < n; i++){
		if(a[i] > 0){
			max += a[i];
			for(j = max; j >= min + a[i]; j--){
				if(f[j] < f[j - a[i]] + b[i]){
					f[j] = f[j - a[i]] + b[i];
				}
			}
		}else{
			min += a[i];
			for(j = min; j <= max + a[i]; j++){
				if(f[j] < f[j - a[i]] + b[i]){
					f[j] = f[j - a[i]] + b[i];
				}
			}
		}
	}
	for(i = max; i >= 0; i--){
		if(f[i] >= 0 && ans < f[i] + i){
			ans = f[i] + i;
		}
	}
	printf("%d\n", ans);
	return 0;
}
posted @ 2011-07-18 13:39  zqynux  阅读(298)  评论(0编辑  收藏  举报