思路:显然选择大的数有最优解,且最多需要34个数即可,因为2^17就超过题目范围的1e5了,那么对于数a[i],要么分配给h要么给w,用dp[i][j]表示处理前i个数h达到j长度时w的最大值。
//reference Dust_Heart
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n, dp[38][100003], arr[100003];
int solve(LL a, LL b, LL h, LL w)
{
int ans= -1;
memset(dp, -1, sizeof(dp));
dp[0][min(a,h)] = min(b, w);
for(int i=1; i<=min(35,(int)n); ++i)
{
for(int j=1; j<=a; ++j)
{
if(dp[i-1][j]==-1) continue;
LL nx = min(a, j*arr[i]);
LL ny = min(b, dp[i-1][j]*arr[i]);
dp[i][j] = max(dp[i][j], ny);
dp[i][nx] = max(dp[i][nx], dp[i-1][j]);
}
}
for(int i=1; i<36; ++i)
if(dp[i][a]>=b)
{
ans = i;
break;
}
return ans;
}
int main()
{
LL a, b, h, w;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&h,&w,&n))
{
for(int i=1; i<=n; ++i)
scanf("%I64d",&arr[i]);
if(h>=a&&w>=b || h>=b&&w>=a)
{
printf("0\n");
continue;
}
sort(arr+1, arr+n+1,greater<LL>());
int ans = min(solve(a, b, h, w), solve(a, b, w, h));
if(ans == -1) puts("-1");
else
printf("%d\n",ans);
}
return 0;
}