算法提高 求最大值 C语言
2017-04-01 15:00
288 查看
#include <stdio.h> #define max(a,b) a>b?a:b; #define INF -9999999 int nums[101][3]={ 0,0,0, 0,-403, -625, 0,-847, 901, 0,-624, -708, 0,-293, 413, 0,886, 709, }; long dp[101][200002]; const int dev=100000; int N=5; int fun(){ long max=INF; int i=0,j=0; for(i=0;i<=N;i++) for(j=-100000;j<=100000;j++) dp[i][j+dev]=INF; for(i=1;i<=N;i++) { dp[i][nums[i][1]+dev]=nums[i][2]; }; for(i=2;i<=N;i++){ for(j=-100000;j<=100000;j++){ dp[i][j+dev]=max(dp[i][j+dev],dp[i-1][j+dev]); if(j+dev-nums[i][1]>200000||j+dev-nums[i][1]<0) continue; dp[i][j+dev]=max(dp[i][j+dev],dp[i-1][j+dev-nums[i][1]]+nums[i][2]); // if(dp [j+dev]>=0) printf("dp[%d][%d+dev]:%ld\n",N,j,dp [j+dev]); } } for(j=0;j<=100000;j++){ max=max(max,(dp [j+dev]>=0 ? j+dp [j+dev] : INF)); } if(max==INF) return 0; return max; } int main(){ int n=0,i=0,p,q; scanf("%d",&n); N=0; for(i=1;i<=n;i++){ scanf("%d%d",&p,&q); if(p<0&&q<0) continue; nums[++N][1]=p; nums [2]=q; } /* */ printf("%ld\n",fun()); return 0; }
时间限制:1.0s 内存限制:256.0MB
问题描述
给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。
输入格式
输入的第一行为n,数对的个数
以下n行每行两个整数 ai bi
输出格式
输出你选定的数对的ai+bi之和
样例输入
5
-403 -625
-847 901
-624 -708
-293 413
886 709
样例输出
1715
数据规模和约定
1<=n<=100
-1000<=ai,bi<=1000
相关文章推荐
- 学习笔记——c语言实现最大连续子序列之和的算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 算法提高 最大乘积 (排序+模拟+贪心)
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 蓝桥杯 算法提高 最大乘积
- 最大熵阈值分割算法的C语言实现
- 算法提高 最大乘积
- 算法提高 最大乘积
- 蓝桥杯 算法提高 最大乘积
- 蓝桥杯- 算法提高 最大乘积
- 求两个整数的最大公约数的各种算法(C语言实现)
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 蓝桥杯 算法提高之最大乘积
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 一维最大熵阈值分割算法的C语言实现
- 算法提高 最大乘积
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 蓝桥杯 算法提高之最大乘积
- 算法提高 最大乘积