您的位置:首页 > 编程语言 > C语言/C++

算法提高 求最大值 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: