完整的AC代码长这样:
#include"bits/stdc++.h"
using namespace std;
#define ri register int
#define ll long long
inline int rd(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
return x;
}
#define N 1010
int s,f[N][610],ans;
struct node{
int cost,val;
}a[N];
inline void init(int x){
a[x].cost=rd(),a[x].val=rd();
a[x].cost*=2;
if(!a[x].val){
init(x<<1),init(x<<1|1);
}
}
inline void chkmax(int &x,int y){if(x<y) x=y;}
inline void dfs(int x){
if(a[x].val) {
for(ri i=0;i<=a[x].val;++i) f[x][i*5+a[x].cost]=i;
return;
}
dfs(x<<1),dfs(x<<1|1);
for(ri i=0;i<=s-1-a[x].cost;++i)
for(ri j=0;j<=i;++j) chkmax(f[x][i+a[x].cost],f[x<<1][j]+f[x<<1|1][i-j]);
}
int main(){
s=rd();
init(1);
dfs(1);
for(ri i=0;i<=s-1;++i) chkmax(ans,f[1][i]);
cout<<ans;
return 0;
}
但是如果把转移那两行改成
for(ri i=0;i<=s-1;++i)
for(ri j=0;j<=i;++j) chkmax(f[x][i+a[x].cost],f[x<<1][j]+f[x<<1|1][i-j]);
就会 WA 掉,为什么啊/kk,感觉这样只会多转移到无用状态啊/kk