rt,代码中 dp 转移的部分只是调换了一点顺序,为什么会导致错误?
60pts:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=505;
int n,x;
vector<int> e[maxn];
int dp[maxn][maxn][2],w[maxn],sz[maxn];
int tmp[maxn][2];
void dfs(int u)
{
dp[u][0][0]=0,dp[u][0][1]=w[u];
sz[u]=1;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
dfs(v);
for(int j=sz[u]-1;j>=0;j--)
for(int k=sz[v]-1;k>=0;k--)
{
if(dp[u][j][0]+max(dp[v][k][0],dp[v][k][1])>dp[u][j+k][0])
dp[u][j+k][0]=dp[u][j][0]+max(dp[v][k][0],dp[v][k][1]);
if(dp[u][j][1]+dp[v][k][0]>dp[u][j+k][1])
dp[u][j+k][1]=dp[u][j][1]+dp[v][k][0];
if(dp[u][j][1]+dp[v][k][1]>dp[u][j+k+1][1])
dp[u][j+k+1][1]=dp[u][j][1]+dp[v][k][1];
//这里调换顺序
}
sz[u]+=sz[v];
}
}
signed main()
{
memset(dp,-0x3f,sizeof(dp));
cin >>n>>x;
for(int f,i=1;i<=n;i++)
cin >>w[i]>>f,e[f].push_back(i);
dfs(0);
for(int i=n;i>=0;i--)
{
if(dp[0][i][0]>=x)
{
cout <<i<<endl;
return 0;
}
}
cout <<-1<<endl;
return 0;
}
100pts:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=505;
int n,x;
vector<int> e[maxn];
int dp[maxn][maxn][2],w[maxn],sz[maxn];
int tmp[maxn][2];
void dfs(int u)
{
dp[u][0][0]=0,dp[u][0][1]=w[u];
sz[u]=1;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
dfs(v);
for(int j=sz[u]-1;j>=0;j--)
for(int k=sz[v]-1;k>=0;k--)
{
dp[u][j+k][0]=max(dp[u][j+k][0],dp[u][j][0]+max(dp[v][k][0],dp[v][k][1]));
dp[u][j+k+1][1]=max(dp[u][j+k+1][1],dp[u][j][1]+dp[v][k][1]);
dp[u][j+k][1]=max(dp[u][j+k][1],dp[u][j][1]+dp[v][k][0]);
//这里调换顺序
}
sz[u]+=sz[v];
}
}
signed main()
{
memset(dp,-0x3f,sizeof(dp));
cin >>n>>x;
for(int f,i=1;i<=n;i++)
cin >>w[i]>>f,e[f].push_back(i);
dfs(0);
for(int i=n;i>=0;i--)
{
if(dp[0][i][0]>=x)
{
cout <<i<<endl;
return 0;
}
}
cout <<-1<<endl;
return 0;
}