您的位置:首页 > 其它

TYVJ 1089 smrtfun 解题报告

2011-07-18 13:39 387 查看
  超猥琐的题目,该怎么说,用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: