【多重背包2】有 N 种物品和一个容量是 V的背包。
第 i种物品最多有 si 件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i
种物品的体积、价值和数量。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N≤1000
0<V≤2000
0<vi,wi,si≤2000
提示:
本题考查多重背包的二进制优化方法。
输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10
'''
多重背包问题 1,采用二进制优化方法解决
二进制优化:采用二进制来表示多个重复的相同物品,把每种物品个数 S[i] = 2^0 + 2^1 + 2^2 +...+Rem
'''
N,V = map(int,input().split())
vs,ws,Ss = [0],[0],[0]
n = 0
real_v,real_w = [0],[0]
for _ in range(N):
v,w,s = map(int,input().split())
vs.append(v)
ws.append(w)
Ss.append(s)
for i in range(1,N+1):
for j in range(1, Ss[i]+1):
n += 1 # 记录二进制优化的物品真正个数
real_v.append(vs[i]*j)
real_w.append(ws[i]*j)
Ss[i] -= j
j *= 2 # 每次x2
if j > Ss[i]:
break
if Ss[i]: # 如果还存有余数Rem
n += 1
real_v.append(vs[i] * Ss[i])
real_w.append(ws[i] * Ss[i])
dp = [0 for i in range(V+1)]
for i in range(1,n+1):
for v in range(V,real_v[i]-1,-1):
dp[v] = max(dp[v],dp[v-real_v[i]] + real_w[i])
print(dp[V])
【快速幂】求 a 的 b 次方对 p取模的值。
输入格式
三个整数 a,b,p,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
0≤a,b≤109
1≤p≤109
输入样例:
3 2 7
输出样例:
2
'''
b可以表示为二进制数,从左往右数,如果是 1:说明b为奇数,ans = a^(b/2) * a^(b/2) * a
如果为 0:说明b为偶数,a^(b/2) * a^(b/2)
时间复杂度是 logn
'''
a,b,p = map(int,input().split())
ans = 1
while(b):
# b & 1 执行按位与操作,用来获取 b二进制 的最低位
if b & 1:
ans = (ans * a) % p
a = (a * a) % p
b = b >> 1
print(ans%p)