4081. 选数

分析一下,能产生0的只有2和5的因子乘积,所以尾部是0的个数取决于min(cnt(2),cnt(5));//2和5因子幂次取最小值;
n个数恰好取k个使得2和5的min尽量大,这时二维状态不够,把5当做第三维
dp[i][k][c5]表示前i个数取k个,5的幂为c5时2的幂的最大值,答案就是dp[i][k][....];
二维费用背包的模型题;
1 #include<bits/stdc++.h> 2 using namespace std; 3 int dp[205][5050]; 4 int v[205],w[205]; 5 int n,k; 6 int main() 7 { 8 //cout<< log(1e18)/log(5)<<endl;25 9 memset(dp,-0x3f,sizeof(dp)); 10 dp[0][0]=0; 11 scanf("%d%d",&n,&k); 12 for(int i=1;i<=n;i++) 13 { 14 long long t; 15 scanf("%lld",&t); 16 while(t%5==0){v[i]++;t/=5;} 17 while(t%2==0){w[i]++;t/=2;} 18 } 19 20 for(int i=1;i<=n;i++) 21 for(int j=k;j;j--) 22 { 23 for(int c=i*25;c>=v[i];c--) 24 dp[j][c]=max(dp[j][c],dp[j-1][c-v[i]]+w[i]); 25 } 26 27 28 int ans=0; 29 for(int i=1;i<=5050;i++) 30 ans=max(ans,min(dp[k][i],i)); 31 cout<<ans<<endl; 32 return 0; 33 } 34 35 /*f[i][j][c5]表示i个数取j个5的幂个数为c5时2的最大幂次; 36 f[i][j][c5]=max(f[i-1][j][c5], f[i-1][j-1][c5-v[i]]+w[i]);*/

浙公网安备 33010602011771号