题目链接:点击打开链接
题目大意:略。
解题思路:一开始把它想成多叉树的遍历情况,虽然没错,但是思维被定向了。
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; }