uva 12105——Bigger is Better

╰半夏微凉° 2022-08-18 02:41 100阅读 0赞

题意:给定n个火柴,求能够摆出的最大的数。

思路:递推,dp(i,j)表示i根火柴拼出除以m余数为j的最大的数,然后递推用dp(i,j)*10+k更新dp(i+mp(k),(j*10+K)%m);lrj说大数精度问题,java乱搞搞过。。

code:

  1. import java.util.*;
  2. import java.math.BigInteger;
  3. public class Main
  4. {
  5. public static void main(String args[])
  6. {
  7. Scanner cin=new Scanner(System.in);
  8. int mp[]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
  9. BigInteger dp[][]=new BigInteger[105][3005];
  10. int ca=0;
  11. while (cin.hasNextInt()){
  12. int n=cin.nextInt();
  13. if (n==0) break;
  14. int m=cin.nextInt();
  15. BigInteger ans=BigInteger.valueOf(-1);
  16. for (int i=0;i<=n;i++)
  17. for (int j=0;j<m;j++)
  18. dp[i][j]=BigInteger.valueOf(-1);
  19. dp[0][0]=BigInteger.valueOf(0);
  20. for (int i=0;i<=n;i++){
  21. for (int j=0;j<m;j++){
  22. if (dp[i][j].compareTo(BigInteger.valueOf(-1))==0) continue;
  23. for (int k=0;k<10;k++){
  24. if (i+mp[k]>n) continue;
  25. BigInteger b=dp[i][j].multiply(BigInteger.valueOf(10)).add(BigInteger.valueOf(k));
  26. if (dp[i+mp[k]][(j*10+k)%m].compareTo(b)==-1)
  27. dp[i+mp[k]][(j*10+k)%m]=b;
  28. }
  29. }
  30. if (i>=2&&ans.compareTo(dp[i][0])==-1) ans=dp[i][0];
  31. }
  32. ca++;
  33. System.out.println("Case "+ca+": "+ans);
  34. }
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,100人围观)

还没有评论,来说两句吧...

相关阅读

    相关 2019,Done is better than perfec

    2018年已经结束,很多小伙伴们已经开始计划2019年的目标,当大家兴致勃勃的立下Flag时,往往这个时候就会出现一个“讨厌”的人(或者是自己内心的想法),他会很严肃的问你: