1. 程式人生 > >微軟offer收割賽之智力競賽

微軟offer收割賽之智力競賽

#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;
}