2160-I.wjw和ly的双人游戏 ZCMU

本文介绍了一种通过深度遍历算法来解决游戏中的最优策略问题,具体案例为两名玩家如何在有限次机会中攻破城堡获取最大宝物。文章提供了一段C++实现代码,展示了如何通过递归的方式枚举所有可能的城堡攻破组合,并最终确定最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值