1. 程式人生 > >藍橋杯 演算法提高 求最大值

藍橋杯 演算法提高 求最大值

演算法提高 求最大值
時間限制: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

思路

我剛開始看,花了很長時間,的確挺難理解的。好在最後畫圖模擬發現其執行規則和01揹包非常像,大概就是其變種,主要是要處理好負數問題。直接貼程式碼,程式碼上有註釋解析:

程式碼

#include<iostream>
#include<algorithm> 
using namespace std;

#define INF 0x3f3f3f3f
#define t 100000   //我們將每個元素+t後儲存,以100000為'0' 
#define N 200001    //每個元素之和最大不會超過20w,所以揹包容量最大也就為N-1 
int dp[105][N];     //dp[i][j]代表前i個元素中,最大所有b[i]元素和的值,j為a[i]滿足的容量,也就是說把a[i]當成揹包容量,b[i]為價值,不過a需要加上t,避免負數 
int A[105],B[105]; int getAns(int len){ for(int i = 0;i<len;i++){ //剛開始需要對dp總每個容量的進行初始化,都為-INF,因為b[i]的累加有可能是負數,所以不能初始化為0!,必須初始化為小於-200000,因此取-INF for(int j = 0;j<N;j++) dp[i][j] = -INF; } for(int i = 0;i < len;i++) dp[i][A[i] + t] = B[i]; //這步是必須的,dp開始前的初值設定,表示當前前i箇中,b[j]和最大的值為B[i],當然只是初試設定,可能隨著程式執行改變其j所在的值
for(int i = 1;i < len;i++){ for(int j = 0;j<=N;j++){//遍歷0 - N之間所有容量,類似01揹包的轉移方程 dp[i][j] = max(dp[i][j],dp[i-1][j]); if(j - A[i] < 0 || j-A[i] > N-1)continue; dp[i][j] = max(dp[i][j],dp[i-1][j-A[i]]+B[i]); } } int result = -INF; for(int j = 0;j<=t;j++){ //最後需要篩選符合的,因為有負數,所以必須從大於100000的地方開始找b[j]最大和,找到符合j+dp[len-1][j+t]的最大,就是符合條件的 //如果結果沒變,說明沒有符合的條件,輸出0 if(dp[len-1][j+t]>=0){ result = max(result,dp[len-1][j+t]+j); } } return result; } int main(){ int n; cin>>n; int len = 0; for(int i = 0;i<n;i++){ int x,y; cin>>x>>y; if(x < 0 && y < 0)continue;//把都是負數的值剔除,沒必要參與運算 A[len] = x; B[len++] = y; } int ans = getAns(len); if(ans <= -INF)cout<<0<<endl; else cout<<ans<<endl; return 0; }

相關推薦

藍橋 演算法提高

演算法提高 求最大值 時間限制:1.0s 記憶體限制:256.0MB 提交此題 問題描述   給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。並且要求你選定的數對的ai之和非負,bi之和

演算法提高

  1<=n<=100  -1000<=ai,bi<=1000 話不多說開始動規,dp[i][j],i表示前i個數對,j表示所採取的數對的ai之和,dp[i][j]表示對應的bi之和。 首先考慮一個問題,題目要求的是ai之和非負,bi之和非負,還有一個隱藏的條件是,如果一個數對都不挑

演算法提高 DP

問題描述   給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。 輸入格式   輸入的第一行為n,數對的個數   以下n行每行兩個整數 ai bi 輸出格式   輸出你

算法提高

one default range 偏移量 small table bsp 最大 wrap 問題描述   給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。 並且要求你選定的數對的ai之和非負,bi之和非負。 輸入格式   

藍橋 演算法提高 ADV-200 動態規劃

演算法提高 求最大值 時間限制:1.0s 記憶體限制:256.0MB 問題描述   給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。 輸入格式   輸入的第一行為n,數對的個數   以下n行每

2016藍橋演算法提高——乘積

演算法提高  最大乘積 問題描述   對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢? 輸入格式   第一行一個數表示資料組數   每組輸入資料共2行:   第1行給出總共的數字

藍橋 演算法提高 ADV-15 乘積

演算法提高 最大乘積 時間限制:1.0s 記憶體限制:512.0MB 問題描述   對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢? 輸入格式   第一行一個數表示資料組數   每組輸入資料共2行:   第1行給出總共的數字的個數n和要取的數的個數m,1<=n<

藍橋演算法提高——遞推(矩陣快速冪)

問題描述   已知遞推公式:   F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,   F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.   初始值為:F(1, 1)=2, F(1,

[藍橋][演算法提高VIP]和大子序列 (Java版)

題目:對於一個給定的長度為N的整數序列A,它的“子序列”的定義是:A中非空的一段連續的元素(整數)。你要完成的任務是,在所有可能的子序列中,找到一個子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程式要求你輸出這個最大值。 我們的校賽選了這道題,

第二整數 藍橋 演算法提高

問題描述 編寫一個程式,讀入一組整數(不超過20個),當用戶輸入0時,表示輸入結束。然後程式將從這組整數中,把第二大的那個整數找出來,並把它打印出來。   說明: (1)0表示輸入結束,它本身並不計入這組整數中。 (2)在這組整數中,既有正數,也可能有負數。 (3

藍橋 演算法提高 ADV-100 第二整數 邏輯判斷 迴圈語句

演算法提高 第二大整數 時間限制:1.0s 記憶體限制:512.0MB 問題描述   編寫一個程式,讀入一組整數(不超過20個),當用戶輸入0時,表示輸入結束。然後程式將從這組整數中,把第二大的那個整數找出來,並把它打印出來。說明:(1)0表示輸入結束,它本身並不計入這組整數中。(2

【ShawnZhang】帶你看藍橋——演算法提高 長單詞

該題通過本提示通過列舉演算法解決,恕本人愚鈍,不太清楚,就用了自己的方法,程式碼附後 遇到的幾個問題,如果使用String s=in.next()將無法儲存空格後的內容,如I am a student,通過這個函式只能儲存第一個單詞  I(單詞意思:我,大寫的i),所以我

哈工大機考:

style 回車 iostream 題目 cin 輸入 class mes 空間 時間限制:1秒 空間限制:32768K 題目描述 輸入10個整數,要求輸出其中的最大值。 輸入描述: 測試數據有多組,每組10個整數。 輸出描述: 對於每組輸入,請輸出其最大值(有回車

TOJ3067: II

namespace cin cout while cnblogs return bsp span mes #include<iostream> #include<algorithm> using namespace std; int main()

樹狀數組 (RMQ with Shifts)

art code else pan [1] int space -s article 代碼: #include <iostream> #include <stdio.h> #include <string.h> #include

紫色的手鏈(和次的異或

tdi 一個 data 不同的 col std 不同 date 格式 描述 那是木姑娘十七歲時,我送給她的生日禮物。(後來手鏈也成為了我最喜歡的出題媒介) 記得最初買的手鏈,由n段紫色的珠子構成,每一顆珠子都被賦予了一種價值評價w[i]。 為了木姑娘,我只惋惜自己不能摘下漫

預處理、const、static與sizeof-用#define實現宏並

最大 運算 code span sizeof stat eof 代碼 bsp 1:實現代碼: #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)>(y)) ? (x):(y)) 需要註

根據狀態變化情況,

decode date 要求 情況 eight 測試表 技術分享 image group 題目1:根據第一二列,計算出第三列。即:求每組KH_VALUE狀態(1和0)變化的最小時間 --創建測試表 create table tmp as select to_date(‘

POJ-2456 Aggressive cows---最大化(也就是

思路 cst target main include IT urn cstring strong 題目鏈接: https://vjudge.net/problem/POJ-2456 題目大意: 有n個牛欄,選m個放進牛,相當於一條線段上有 n 個點,選取 m 個點, 使得相

C語言-

main pan PE color 最大值 get eve else b- #include<stdio.h> void main() {int a,b,c,d; scanf("%d,%d,%d",&a,&b,&c);