#include<bits/stdc++.h> usingnamespace std; #define int long long constint N = 220; int cnt2[222], cnt5[222]; int dp[222][5555]; signedmain() { int n, k; cin >> n >> k; memset(dp, -0x3f, sizeof(dp)); //没访问到初始化为无穷小 dp[0][0] = 0; //初始化记得 for (int i = 1; i <= n; i++) { int x; cin >> x; while (x % 2 == 0) { x /= 2; cnt2[i]++; } while (x % 5 == 0) { x /= 5; cnt5[i]++; } //这里我们直接对x进行操作是因为分离因子的时候我们用的2,5都是质因子,是不会有影响的 //我们不用记录数是因为我们只关心2,5的个数,存在数组就可以了 } for (int i = 1; i <= n; i++) { for (int j = k; j >= 1; j--) { for (int l = cnt5[i]; l <= 5000; l++) { //这里k会重名所以我们用l代替 dp[j][l] = max(dp[j][l], dp[j - 1][l - cnt5[i]] + cnt2[i]); } } } int ans = 0; // 这里我以前打了个-1145141919810 结果WA了才发现答案可能为0 说出来让你开心开心 for (int i = 1; i <= 5000; i++) { ans = max(ans, min(i, dp[k][i]));// 题目让求最大了 } cout << ans; return0; }