Description
wjw和ly最近买了一个switch玩,switch上有个游戏,具体过程可以简化成在一张地图上,有N个城堡,每个城堡都有宝物,每局游戏中允许他们攻破M个城堡并且获得奖励,但是由于地图的限制,有些城堡不能直接攻破,要攻破这些城堡必须先攻破其他特定的城堡,所以你可以帮ly和wjw计算出怎么攻破城堡能获得最多的宝物吗?
Input
每组测试数据包含2个整数,N,M(1 <= M <= N <= 10);
在接下来的N行里,每行包含2个整数a,b.
在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。
b 代表第 i 个城堡的宝物数量, b >= 0。
当N = 0, M = 0输入结束。
Output
对于每组数据,输出一个整数,表示ly和wjw能够获得的最多宝物的数量。
Sample Input
3 2
0 1
0 2
0 3
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
0 0
Sample Output
5
13
解析
搜索,遍历每一种情况
代码
#include<bits/stdc++.h>
using namespace std;
int val,n,m,cas[20],tre[20],book[20];
void dfs(int castle,int c)
{
if(c==m)
{
int value=0,num=0;
for(int i=1;i<=n;i++)
{
if(book[i]==1)
{
if(cas[i]==0||book[cas[i]]==1)
{
num++;
value+=tre[i];
}
}
}
if(num==m)
val=max(val,value);
return ;
}
if(castle>n) return ;
book[castle]=1;
dfs(castle+1,c+1);
book[castle]=0;
dfs(castle+1,c);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&cas[i],&tre[i]);
}
memset(book,0,sizeof(book));
val=0;
dfs(0,0);
printf("%d\n",val);
}
return 0;
}