ACwing 4081. 选数
1 #include2 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)< 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< 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]);*/endl;
二维费用背包,注意条件是恰好,初始化除了dp[0][0]都是不合法的,因为前0件物品恰好选j个获得恰好c5的数根本选不出来,不合法,初始化全部memset -inf;