比赛 15级练手赛 评测结果 AAAAAAAAAA
题目名称 采药(加强版) 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 3.166 s
代码语言 C++ 内存使用 5.52 MiB
提交时间 2018-08-28 20:11:22
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int yp[21][21];//体积・价值
  5. int v[250001];
  6. int w[250001];
  7. int dp[3][40001];
  8. int main()
  9. {
  10. freopen("crazytime.in","r",stdin);
  11. freopen("crazytime.out","w",stdout);
  12. int n,m;
  13. cin>>n>>m;
  14. int a,b;
  15. for(int i=1;i<=20;i++)
  16. {
  17. for(int j=1;j<=20;j++)
  18. {
  19. yp[i][j]=0;
  20. }
  21. }
  22. int maxa=0;
  23. int maxb=0;
  24. for(int i=1;i<=n;i++)
  25. {
  26. cin>>a>>b;
  27. yp[a][b]++;
  28. maxa=max(maxa,a);
  29. maxb=max(maxb,b);
  30. }
  31. int s=0;
  32. int jl=1;
  33. for(int i=1;i<=maxa;i++)
  34. {
  35. for(int j=1;j<=maxb;j++)
  36. {
  37. if(yp[i][j]>0)
  38. {
  39. int u=1;
  40. for(;;)
  41. {
  42. if(yp[i][j]>=u)
  43. {
  44. v[jl]=i*u;
  45. w[jl]=j*u;
  46. yp[i][j]=yp[i][j]-u;
  47. jl++;
  48. u<<=1;
  49. }
  50. else
  51. {
  52. if(yp[i][j]>0)
  53. {
  54. v[jl]=i*yp[i][j];
  55. w[jl]=j*yp[i][j];
  56. jl++;
  57. }
  58. break;
  59. }
  60. }
  61. }
  62. }
  63. }
  64. jl--;
  65. for(int i=0;i<=40000;i++)
  66. {
  67. for(int j=0;j<=2;j++)
  68. {
  69. dp[j][i]=0;
  70. }
  71. }
  72. int se=0;
  73. for(int i=1;i<=jl;i++)
  74. {
  75. se=1-se;
  76. for(int j=m;j>=0;j--)
  77. {
  78. if(j>=v[i])
  79. {
  80. dp[se][j]=max(dp[1-se][j],dp[1-se][j-v[i]]+w[i]);
  81. }
  82. else
  83. dp[se][j]=dp[1-se][j];
  84. }
  85. }
  86. cout<<dp[se][m];
  87. return 0;
  88. }