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