算法提高 求最大值

149 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

问题描述

  给n个有序整数对aibi,你需要选择一些整数对 使得所有你选定的数的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

参考代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] dp = new int[222222];
        for (int i = 0; i <= 200000; i++) dp[i] = -Integer.MAX_VALUE;
        dp[100000] = 0;
        int ans=0;
        int i,j;
        for(i=0;i<n;i++) {
        	int x,y;
        	x = sc.nextInt();
        	y = sc.nextInt();
        	if(x>=0) {
        		for(j=200000;j>=x;j--) {
        			if(dp[j-x] > -Integer.MAX_VALUE) {
        				dp[j] = Math.max(dp[j], dp[j-x]+y);
        			}
        		}
        	}
        	else {
        		for(j=0;j<=200000+x;j++) {
        			if(dp[j-x]>-Integer.MAX_VALUE) {
        				dp[j] = Math.max(dp[j], dp[j-x]+y);
        			}
        		}
        	}
        }
        for(i=100000;i<=200000;i++) {
        	if(dp[i]>=0) {
        		ans = Math.max(ans, i-100000+dp[i]);
        	}
        }
        System.out.print(ans);
    }
}