C - 123引き算 / AtCoderBeginnerContest#011
#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を出力。
~了~