列表

详情


NC200633. 来来来 比比咱谁更聪明

描述

小j和小k一起玩一个简单的小游戏,有一个容量为n的瓶子,此外还有m个容量不等杯子,他们用杯子装满水轮流往瓶子中倒水,如果谁把杯子中的水不能完全倒入瓶子中,则算输,小j先开始往瓶中倒水,两个人都足够聪明,请问,小j能赢吗?
注意: 每一个杯子可以重复用多次

输入描述

输入要求:首先输入n表示瓶子的容量,接下来输入m表示杯子的数量,
接下来输入m个数表示杯子的容量k(0<n<=1000,0<m<=1000,0<k<=1000,n,m,k都是整数

输出描述

输出要求:如果能赢则输出Y,否则输出N。

示例1

输入:

10 4
2 3 6 8

输出:

N

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-04-11 16:27:16

#include<bits/stdc++.h>
using namespace std;
int ans[1005],a[1005];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++){
			if(i>=a[j]&&!ans[i-a[j]])ans[i]=1;
		}
	}
	if(ans[n])cout<<"Y"<<endl;
	else cout<<"N"<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2020-01-09 15:32:46

#include <bits/stdc++.h>
using namespace std;
int f[1005],a[1005];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	if(i>=a[j]&&!f[i-a[j]]) f[i]=1;
	if(f[n]) puts("Y");
	else puts("N");
}

上一题