數學題dp題
現在有n個物品,每個物品都有乙個價值,現在想將這些物品分給兩個人,要求這兩個人分到的物品價值總和相同(個數可以不同,總價值相同即可),剩下的物品就要扔掉,現在想知道最少需要扔多少價值的物品才能滿足要求分給兩個人。暴力法,時間複雜度為o(3
n)
o(3^n)
o(3n
)
import sys
if __name__ ==
"__main__"
: n =
int(sys.stdin.readline(
).strip())
# 讀取每一行
line = sys.stdin.readline(
).strip(
)# 把每一行的數字分隔後轉化成int列表
data =
list
(map
(int
, line.split())
) res = sys.maxsize
defdfs(idx, a, b, drop)
:global res
if idx ==
len(data)
:if a == b:
res =
min(res, drop)
return
dfs(idx+
1, a+data[idx]
, b, drop)
dfs(idx+
1, a, b+data[idx]
, drop)
dfs(idx+
1, a, b, drop+data[idx]
) dfs(0,
0,0,
0)print
(res)
dp法,時間複雜度為o(n
∗tot
al
)o(n*total)
o(n∗to
tal)
,t ot
al
total
tota
l是所有物品價值之和
import sys
if __name__ ==
"__main__"
: n =
int(sys.stdin.readline(
).strip())
# 讀取每一行
line = sys.stdin.readline(
).strip(
)# 把每一行的數字分隔後轉化成int列表
data =
list
(map
(int
, line.split())
) total =
sum(data)
dp =[0
]*(total+1)
dp[0]
=1for i in
range
(n):
for j in
range
(total, data[i]-1
,-1)
: dp[j]
= dp[j]
| dp[j-data[i]
] res = total
for i in
range
(total,-1
,-1)
:if i %2!=
0:continue
if dp[i]
and dp[i//2]
: res = total-i
break
print
(res)
n個教授討論學術成果,如果教授i圖論之有向圖尋找強連通分量,強連通分量指的是結點可以互相到達的子圖。使用tarjan演算法,時間複雜度為o(vii認可教授j
jj,教授j
jj認可教授k
kk,那麼可以認為教授i
ii認可教授k
kk。教授可以自己認可自己的學術成果。
+e
)o(v+e)
o(v+e)
,v
vv表示結點個數,e
ee表示有向邊個數。
from collections import defaultdict
deftarjan
(node)
:global dfn, low, time, stack, res
dfn[node]
= low[node]
= time
time +=
1for adj_node in graph[node]
:if dfn[adj_node]==0
: tarjan(adj_node)
low[node]
=min
(low[node]
, low[adj_node]
)elif adj_node in stack:
low[node]
=min
(low[node]
, low[adj_node]
) count =
0if dfn[node]
== low[node]
:while stack:
tmp = stack.pop(
) count +=
1if tmp == node:
break
if count >1:
res +=
int(
(count*
(count-1)
)/2)
if __name__ ==
"__main__"
:# 讀取每一行
line = sys.stdin.readline(
).strip(
)# 把每一行的數字分隔後轉化成int列表
nm =
list
(map
(int
, line.split())
) n, m = nm[0]
, nm[1]
# 構建圖
time =
1 dfn =[0
]*(n+1
) low =[0
]*(n+1
) stack =
graph = defaultdict(
list
)for i in
range
(m):
# 讀取每一行
line = sys.stdin.readline(
).strip(
)# 把每一行的數字分隔後轉化成int列表
xy =
list
(map
(int
, line.split())
)if xy[0]
== xy[1]
:continue
graph[xy[0]
]1])
res =
0for node in
range(1
, n+1)
:if dfn[node]==0
: tarjan(node)
print
(res)
2020 08 08網易筆試
注釋部分 超時了,優化後如下 def test1 n int input arr list map int input strip split n res 0for i in range n res countprime arr i return res defcountprime n if n 2...
2012網易筆試題
1 24小時內,表的時針 分針 秒針完全重合多少次?分別是什麼時刻。2 100萬條記錄,可以通過權值比較大小,選取權值最大的前100條記錄,並有序排列後輸出 3 鏈式資料結構,檢測是否有環 4 用反射建立classa的例項和classa陣列的例項 5 聯合索引的問題。問select語句如何寫,才能用...
2012 10 10網易筆試題
一.用位運算實現加法 int add int a,int b 二.確定cpu的大小端方式 筆試的時候此題做錯了,竟用移位去做.對於此操作,移位不起作用.int main 三.圖的深度遍歷 筆試的時候沒有寫出來,寫出思路為利用棧乙個個結點壓入.直到棧頂那個結點無指向子鏈結或連線已遍歷過或指向的鏈結的結...