C - 123引き算 / AtCoderBeginnerContest#011

abc011.contest.atcoder.jp

#include <algorithm>
#include <iostream>
using namespace std;

#define INF (1<<29)

void Solve(int n)	{
	int ng1, ng2, ng3;
	int dp[300+1];
	bool flg=true;

	cin >> ng1 >> ng2 >> ng3;
	if (n==ng1 || n==ng2 || n==ng3)	flg=false;
	if (flg)	{
		for (int i=0; i<=300; ++i)
			dp[i]=INF;
		dp[n]=0;
		for (int i=n; i>=0; --i)	{
			if (i==ng1 || i==ng2 || i==ng3)	continue;
			for (int j=1; j<=3; ++j)
				dp[i-j]=min(dp[i]+1,dp[i-j]);
		}
		if (100 < dp[0])	flg=false;
	}
	cout << (flg? "YES" : "NO") << endl;
}

int main(void)	{
	int n;

	cin >> n;
	Solve(n);
	return 0;
}

動的計画法を用いて、100回以内でNG数に掛かること無く0になればYES、無理であればNOを出力。
~了~