zoukankan      html  css  js  c++  java
  • hdu 1171 母函数

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #define MAX 250010 //注意得开大点
    5. int c1[MAX], c2[MAX];
    6. int num[55], val[55];
    7. int main()
    8. {
    9. int n;
    10. while( scanf("%d", &n)!=EOF && n>0)
    11. {
    12. int total = 0;
    13. memset(val, 0, sizeof(val) );
    14. memset(num, 0, sizeof(num) );
    15. for(int i=0; i<n; i++)
    16. {scanf("%d %d", &val[i], &num[i]); total += val[i]*num[i];}
    17. memset(c1, 0, sizeof(c1) );
    18. memset(c2, 0, sizeof(c2) );
    19. for(int i=0; i<=num[0]*val[0]; i+=val[0]) //第一项全部至0
    20. c1[i]=1;
    21. int len = num[0]*val[0];
    22. for(int i=1; i<n; i++)
    23. {
    24. for(int j=0; j<=len; j++)
    25. for(int k=0; k<=num[i]*val[i]; k+=val[i])
    26. c2[k+j] += c1[j]; //一定得是累加
    27. len += val[i]*num[i];
    28. for(int j=0; j<=len; j++) //结束一轮运算赋值
    29. {
    30. c1[j] = c2[j]; c2[j] = 0;
    31. }
    32. }
    33. /*
    34. 如果我们往递减的方向遍历就不会重叠误差而导致影响的那个”点”(真实值),也就不用单独考虑total/2是否刚好整除了。
    35. 比如有一组样例就可以说明这一点:
    36. 2
    37. 4 1
    38. 1 1
    39. */
    40. /*for(int i=total/2;i<=total;i++)
    41. {
    42. if(c1[i])
    43. {
    44. printf("%d %d ",i,total-i);
    45. break;
    46. }
    47. } 错的*/
    48. for(int i= total/2; i>=0; --i)
    49. if(c1[i] != 0)
    50. {
    51. printf("%d %d ", total-i, i);
    52. break;
    53. }
    54. }
    55. return 0;
    56. }





    附件列表

    • 相关阅读:
      java反射小练习
      Set与list测试
      关于用户界面
      自定义标签打包使用问题
      jsp中获取当前访问路径
      LeetCode 汇总
      LeetCode 46. 全排列
      LeetCode 40.组合总和II
      LeetCode 39.组合总和
      LeetCode 37.解数独
    • 原文地址:https://www.cnblogs.com/sober-reflection/p/758afc52928bb522b2536583bb842a35.html
    Copyright © 2011-2022 走看看