微軟offer收割賽之智力競賽
阿新 • • 發佈:2019-01-26
#include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; const int INF = 0x3f3f3f3f; int n, m, s, t; int a[maxn]; int dp[maxn][maxn]; void solve(){ memset(dp, 0x3f, sizeof dp); memset(dp[0], 0, sizeof dp[0]); int p, q; for(int i = 1; i <= n; i++){ int k = ceil(a[i]* 1.0 / s); for(int p = 0; p <= k; p++){ int temp = a[i] - p * s; if(temp >= 0) { q = ceil(temp * 1.0 / t); } else { q = 0; } for(int j = p + q; j <= m; j++){ dp[i][j] = min(dp[i - 1][j - (p + q)] + p, dp[i][j]); } } } if(dp[n][m] != INF){ cout << dp[n][m] << endl; } else { cout << "No" << endl; } } int main(){ int Q; scanf("%d", &Q); while(Q--){ scanf("%d%d%d%d", &n, &m, &s, &t); for(int i = 1; i <= n; i++){ scanf("%d", a + i); } solve(); } return 0; }