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; }
相关文章推荐
- TYVJ 1079 数字三角形3 解题报告
- TYVJ 1088 treat 解题报告
- TYVJ 1209 拦截导弹 解题报告
- TYVJ 1096 数字组合 解题报告
- TYVJ 1100 超级书架2 解题报告
- TYVJ 1114 搭建双塔 解题报告
- TYVJ 1116 被7整除 解题报告
- [TYVJ1730]二逼平衡树解题报告
- TYVJ 1087 sumsets 解题报告
- TYVJ 1101 字典序 解题报告
- 解题报告 tyvj 1068
- TYVJ 1084 数字三角形4 解题报告
- TYVJ 1078 删数 解题报告
- TYVJ 1102 单词的划分 解题报告
- TYVJ 1124 花店橱窗 解题报告
- TYVJ 1067 合唱队形 解题报告
- TYVJ 1066 合并果子 解题报告
- TYVJ 1086 Elevator 解题报告
- tyvj1089 smrtfun
- TYVJ 1091 等差数列 解题报告