小q打算穿越怪獸谷,他不會打怪,但是他有錢。
他知道,只要給怪獸一定的金幣,怪獸就會一直護送著他出谷。
在谷中,他會依次遇見n只怪獸,每只怪獸都有自己的武力值和要「賄賂」它所需的金幣數。
如果小q沒有「賄賂」某只怪獸,而這只怪獸「武力值」又大於護送他的怪獸武力之和,這只怪獸就會攻擊他。
小q想知道,要想成功穿越怪獸谷而不被攻擊,他最少要準備多少金幣。
輸入格式
第一行包含整數n,表示怪獸的數量。
第二行包含n個整數d1,d2,…,dnd1,d2,…,dn,表示每只怪獸的武力值。
第三行包含n個整數p1,p2,…,pnp1,p2,…,pn,表示收買n只怪獸所需的金幣數。
輸出格式
輸出乙個整數,表示所需最小金幣數。
資料範圍
1≤n≤501≤n≤50,
1≤di≤10121≤di≤1012,
1≤pi≤21≤pi≤2
輸入樣例1:
3
8 5 10
1 1 2
輸出樣例1:
2
輸入樣例2:
4
1 2 4 8
1 2 1 2
輸出樣例2:
6
這道題目怪獸的武力值比較大,要用longlong 來存,所以如果用dp[i][j] 表示前i個怪獸物理值為j所用的金幣數,是非常大的狀態。
而金幣數不是1就是2,所以用dp[i][j]表示前i個怪獸,用j個金幣時的最大武力值,那麼有如下關係
dp[i][j] = max(dp[i-1][j],dp[i-1][j-p[i]] + d[i]]) 前面成立的條件是dp[i-1][j] >= d[i] , 後面成立的條件是j>=p[i]
這裡要注意,不是所有的狀態都能存在的,不存在的狀態用dp[i][j] = -1 表示
最後的答案就是dp[n][j], j是第乙個不為-1的數
首先先把所有的dp設為-1,dp[0][0]=0 開始遞推。
怪獸的編號從1到n
#include #include #include using namespace std;
const int n = 60;
int main()
for (int i = 1; i <= n; i++)
dp[0][0] = 0;
for (int i = 1; i <= n; i++)
} int res = 0;
for (int i = 1; i <= 2*n; i++)
} cout << res << endl;
return 0;
}
2019校招實習筆試彙總
mark下遇到的筆試題吧 招行演算法 同學遇到的題,筆試後交流了下思路,由於a範圍比較小,所以可以暴力 搜尋剪枝 加用集合和字典優化。複雜度大概o n logn 有n種不同的化學試劑。第i種有ai公升。每次實驗都要把所有的化學試劑混在一起,但是這些試劑的量一定要相等。所以現在的首要任務是把這些化學試...
2020 360實習校招演算法筆試題
使用python3 題目描述 有一種特殊的dna,僅僅由核酸a和t組成,長度為n,順次連線。科學家有一種新的手段,可以改變這種dna。每一次,科學家可以交換該dna上兩個核酸的位置,也可以將某個特定位置的核酸修改為另一種核酸。現在有乙個dna,科學家希望將其改造成另一種dna,希望你計算最少的操作次...
2017騰訊校招暑期實習生筆試題3
小q今天在上廁所時想到了這個問題 有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?輸入包含多組測試資料。小q今天在上廁所時想到了這個問題 有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?輸入描述 輸入包含多組測試資料。對於每組測試資料 n 本組測試資料有n個數 a1,a2 an 需要...