ZCMU - 1384: 简单题4

题目链接:点击打开链接


题目大意:略。


解题思路:一开始把它想成多叉树的遍历情况,虽然没错,但是思维被定向了


AC 代码

#include
#include

#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;
}

你可能感兴趣的:(#,ACM,#,ZCMU,#,DFS)