ACwing 4081. 选数


 1 #include
 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)<
 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<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]);*/

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

相关