Problem G. Wiki with Alpha

最近,在拉布拉多星球举办了一场举世瞩目的人机智力pk赛。当然pk赛的主角依然是我们的Wiki同学,
他的对手是一个名为"Alpha"的超强机器人!比赛规定最终获得胜利的一方将会得到"卡哇伊"魔法权杖,
得到权杖的一方也将统治拉布拉多星球。
已知"卡哇伊"魔法权杖需要注入能量才能发挥威力。现在比赛现场一共有k种的能量水晶,不同的水晶可
能具有不同的能力值ai且每种能量水晶可以被使用无限次
现在比赛要求选手轮流将能量水晶注入魔法权杖之中,选手每次可以在这k种水晶中挑选任意一个注入魔
法权杖(选中的水晶必须用完,不能剩余),谁先为权杖注满能量(这里假设魔法权杖所需能量值为n,
满意味着刚好等于n,不能多于n),谁就赢得胜利。
由于在抛硬币的过程中, Wiki赢得了胜利,因此, Wiki先进行能量注入, Alpha后进行,然后依次轮流
下去,直到比赛结束。
众所周知, WikiAlpha都绝顶聪明,请问谁将赢得最终胜利?如果Wiki得到"卡哇伊"魔法权杖,请输
"Wiki Wins";否则,输出"Wiki Loses"

Input
第 一 行 输 入 两 个 正 整 数nk, 表 示 魔 法 权 杖 需 要 的 能 量 值 和 能 量 水 晶 的 种 类 个
(1 <= n <= 100000; 1 <= k <= 100)
接下来输入k个正整数ai(1 <= ai <= 10000),表示每种水晶的能量值,数与数之间用一个空格隔开(题目
保证ai中至少有一个为1
Output
输出比赛结果
Samples

standard input standard output
5 2
1 4
Wiki Loses
10 8
2 1 6 7 8 10 9 20
Wiki Wins


思路:从小到大枚举能量值,只要当前的能量小于枚举的能量值以及枚举的能量值减去当前的能量值是false(是false)表示是对手获胜
最后判断目标能量值是否是true即可

#include <iostream>

using namespace std ;

const int N = 100010, M = 110 ;

bool f[N] ;
int w[M] ;
int n, m ;

int main(){
    cin >> m >> n ;
    
    for(int i=0;i<n;i++) cin >> w[i] ;
    
    for(int i=1;i<=m;i++){
        for(int j=0;j<n;j++){
            if(i>=w[j] && !f[i-w[j]]){
                f[i] = true ;
                break ;
            }
        }
    }
    if(f[m]){
        cout << "Wiki Wins" << endl ;
    }else{
        cout << "Wiki Loses" << endl ;
    }
    return 0 ;
}

...

原文地址:https://www.cnblogs.com/gulangyuzzz/p/12560310.html