ACwing 4081. 选数

 

 

 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]);*/
View Code

二维费用背包,注意条件是恰好,初始化除了dp[0][0]都是不合法的,因为前0件物品恰好选j个获得恰好c5的数根本选不出来,不合法,初始化全部memset -inf;

posted @ 2021-11-29 21:51  matt-11  阅读(51)  评论(0)    收藏  举报