题目链接:点击打开链接
题目大意:略。
解题思路:一开始把它想成多叉树的遍历情况,虽然没错,但是思维被定向了。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
using namespace std;
typedef long long ll;
int a[30],b[30],vis[30];
int n,m,rs,ans;
void init()
{
ans=rs=0;
mem(a,0); mem(b,0); mem(vis,0);
}
void dfs(int k)
{
if(k==m)
{
rs=max(rs,ans);
return;
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0 && (a[i]==0||vis[a[i]]==1))
{
vis[i]=1;
ans+=b[i];
dfs(k+1);
ans-=b[i];
vis[i]=0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==m&&n==0) break;
init();
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
dfs(0);
printf("%d\n",rs);
}
return 0;
}