hdu 1085 母函数初步

  1. #include<iostream>
  2. using namespace std;
  3. #define max 10010
  4. int c1[max],c2[max]; //c1存结果,c2存临时处理数据
  5. //Y=(1+x+x^2+x^3+x^4…+x^n1*1)*(1+x^2+x^4+x^6…x^n2*2)*(1+x^5+x^10+…x^n3*5)
  6. int main()
  7. {
  8. int num[3];
  9. int val[] = {1, 2, 5};
  10. while( scanf("%d%d%d", &num[0], &num[1], &num[2])!=EOF && (num[0]+num[1]+num[2]) )
  11. {
  12. int n = num[0]*1+num[1]*2+num[2]*5; //n为x的指数,代表最后所有的硬币的总价值
  13. memset(c1, 0, sizeof(c1) );
  14. memset(c2, 0, sizeof(c2) );
  15. for(int i=0; i<=num[0]; i+=val[0]) //第一个括号内的每个项项数初始化为1
  16. {
  17. c1[i]= 1;
  18. }
  19. for(int i=1; i<=2; i++) //第i个括号
  20. {
  21. for(int j=0; j<=n; j++) //括号内第j项
  22. for(int k=0; k+j<=n && k<=num[i]*val[i]; k+=val[i]) //第j项的指数
  23. c2[j+k] +=c1[j];
  24. for(int i=0; i<=n; i++) //每两个括号内相乘,将值赋给c1
  25. {c1[i] = c2[i]; c2[i]=0;}
  26. }
  27. for(int i=0; i<=n+1; i++) //注意是到n+1, 因为有可能前n个都可以,n+1个事超过了说给金币的全数量和
  28. if(c1[i] == 0)
  29. {printf("%d\n", i); break;}
  30. }
  31. return 0;
  32. }
  33. /*
  34. Given some Chinese Coins (硬币) (three kinds-- 1, 2, 5), and their number is num_1, num_2 and num_5 respectively, please output the minimum value that you cannot pay with given coins.”
  35. You, super ACMer, should solve the problem easily, and don’t forget to take $25000000 from Bush!
  36. Input
  37. Input contains multiple test cases. Each test case contains 3 positive integers num_1, num_2 and num_5 (0<=num_i<=1000). A test case containing 0 0 0 terminates the input and this test case is not to be processed.
  38. Output
  39. Output the minimum positive value that one cannot pay with given coins, one line for one case.
  40. Sample Input
  41. 1 1 3
  42. 0 0 0
  43. Sample Output
  44. 4
  45. */





附件列表

     

    posted @ 2015-01-29 15:34  sober_reflection  阅读(117)  评论(0编辑  收藏  举报