HDU 1574 RP問題(01揹包)

2021-07-05 10:13:32 字數 1195 閱讀 8046

題目大意:在人類社會中,任何個體都具有人品,人品有各種不同的形式,可以從一種形式轉換為另一種形式,從乙個個體傳遞給另乙個個體,在轉換和傳遞的過程中,人品不會消失,也不被能創造,這就是,人品守恆定律!

人品守恆定律更形象的描述,當發生一件好事,你從中獲利,必定消耗一定量rp;當發生一件不幸的事,你在其中有所損失,必定積攢一定量rp。

假設在乙個時間段內在你身上可能會發生n個事件,每個事件都對應乙個rp變化值a、rp門檻值b和獲益值c。當rp變化值a為正,獲益值c必定為負,只有你當前的rp值小於等於rp門檻值b的時候,此事件才有可能發生,當此事件發生時,你的rp值將增加|a|,獲益值將減少|c|。反之,當rp變化值a為負,獲益值c必定為正,只有你當前的rp值大於等於rp門檻值b的時候,此事件才有可能發生,當此事件發生時,你的rp值將減少|a|,獲益值將增加|c|。

乙個事件在滿足上述rp條件的前提下,未必會發生。假設在這段時間之前你所具有的rp值和獲益值都為0,那麼過了這段時間後,你可能達到的最大獲益值是多少?

注意:乙個人的所具有的rp值可能為負。

解題思路:01揹包,分類討論一下就可以

因為rp只能在[-10000,10000],且有可能為負數,所以就每個rp值加上10000,這樣就不會出現負的情況了

#include 

#include

#include

using

namespace

std;

const

int n = 20010;

const

int inf = 0x3f3f3f3f;

int dp[n];

bool vis[n];

int n;

void solve()

else dp[j + a] = max(dp[j + a], dp[j] + c);}}

}else

if (a < 0)

else dp[j + a] = max(dp[j + a], dp[j] + c);}}

}}

int ans = -inf;

for (int i = 0; i < 20010; i++)

ans = max(dp[i], ans);

printf("%d\n", ans);

}int main()

return

0;}

hdu 1574 RP問題 01揹包的變形

hdu 1574 rp問題 分析 01揹包的變形。rp可能為負,所以這裡分兩種情況處理一下就好。初始化要注意。include include include includeusing namespace std define inf 0x3f3f3f3f int f 20001 th int a,b...

01揹包問題HDU2602

典型的01揹包問題,用動態規劃來解即可。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程便是 f i v max 這個方程非常重要 基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下 將前i件物品放入容量為v的揹包...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...