0%

Codeforces Round 1048 (Div. 2)——E1. Maple and Tree Beauty (Easy Version)(背包问题)(子集枚举→能否凑出某个的和)

思路讲解

https://chatgpt.com/share/68c0ff99-20d0-8013-b16a-26d60768748a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 我们会发现,能否通过前K关(构造出K前缀),和这个顺序是没有关系的
// 我们直接看前 K 个物品是否可以凑出一个和
// vector<vii> dp(SZ(ls)+5,vii(N+5));
vii dp(N+5);
ll sum=0;
ll ans=0;
// 滚动数组优化,第i层哪些值是可以达到的
dp[0]=true;
FOR(i,1,desti){
ll w=ls[i];
sum+=w;
// 滚动数组反向遍历
ROF(j,N-w,0){
dp[w+j]|=dp[j];
}
FOR(a,0,N){
if(dp[a]){
ll b=sum-a;
if((a<=K && b<=N-K) || (b<=K && a<=N-K) ){
ans=i;
break;
}
}
}
if(ans!=i){
break;
}
}

AC代码

心路历程(WA,TLE,MLE……)