220405总结
220405总结
T1 潜水员
和普通的01背包的不不同点在于,有两个状态需要转移:氧气量和氮气量
令 \(f(u,v)\) 为拥有 \(u\) 升氧气 \(v\) 升氮气所需的最小气缸重量
想到 最小 二字,自然能想到用 \(\min\) 去转移
其他的就和普通的背包相同了
\(f(u,v)=\displaystyle\min_{i=1}^k(f(u-a_i,v-b_i)+c_i)\)
T2 分组背包
裸的板子题
枚举背包编号,先确定背包限制大小,再选物品去更新
for(int i = 1;i<=T;i++){
for(int j = V;j>=0;j--){
for(int k = 1;k<=BAGn[i][0];k++){
int ind = BAGn[i][k];
if(j >= A[ind].w){
dp[j] = max(dp[j],dp[j-A[ind].w]+A[ind].v);
}
}
}
}
T3 小球
因为是一棵满二叉树,所以节点 \(i\) 的左孩子是 \(2i\) ,右孩子是 \(2i+1\)
设这棵树的高度为 \(dep\)
则所有的叶子节点的编号都在 \([2^{dep-1},2^{dep})\) 这个区间里面
模拟即可
bool tree[2000000];
leaL = 1<<(D-1);
while(I--){
k = 1;
while(k < leaL){
ad = 0;
if(tree[k]) ad = 1;
tree[k] = !tree[k];
k = (k << 1) | ad;
}
res = k;
}
printf("%d",res);