以下にような動的計画法を考えましょう。
体力を だけ減らした時の攻撃回数の最小値
の場合は遷移を行わないことに注意してください。
#include<bits/stdc++.h> using namespace std; const int INF = 1 << 30; int dp[10001]; int main(){ int h, n; cin >> h >> n; vector<int> a(n); for(int i = 0; i < n; i++){ cin >> a[i]; } for(int i = 0; i < 10001; i++){ dp[i] = INF; } dp[0] = 0; for(int i = 0; i < h / 2; i++){ for(int j = 0; j < n; j++){ if(dp[i] == INF) continue; dp[min(i + a[j], h)] = min(dp[min(i + a[j], h)], dp[i] + 1); } } sort(a.rbegin(), a.rend()); int ans = INF; for(int i = 0; i < h / 2; i++){ if(dp[i] == INF) continue; if(i + a[0] >= h){ ans = min(ans, dp[i] + 1); } } if(ans == INF){ cout << -1 << "\n"; }else{ cout << ans << "\n"; } }