3.1 Stamps 题解

来源:互联网 发布:网络不稳定如何检测 编辑:程序博客网 时间:2024/05/11 21:06

     给一组邮票n张,每张价值为v,以及最多使用的邮票的数量k,求能组合成的最长的连续的邮票价值数。

     这是一道很经典的题目,一老师在讲具体数学的时候说有O1)的算法,不过要下节课才能听到。

     我用的是完全背包,代码较为简洁,时间还可以(最坏情况也保持在了1s以内),不过内存用了不少。

USER: millky wang [ts_mill1]

TASK: stamps

LANG: C++

Compiling...

Compile: OK

Executing...

   Test 1: TEST OK [0.022 secs, 2844 KB]

   Test 2: TEST OK [0.000 secs, 2848 KB]

   Test 3: TEST OK [0.011 secs, 2848 KB]

   Test 4: TEST OK [0.000 secs, 2844 KB]

   Test 5: TEST OK [0.000 secs, 2848 KB]

   Test 6: TEST OK [0.000 secs, 2844 KB]

   Test 7: TEST OK [0.011 secs, 2844 KB]

   Test 8: TEST OK [0.000 secs, 2852 KB]

   Test 9: TEST OK [0.011 secs, 2904 KB]

   Test 10: TEST OK [0.086 secs, 5448 KB]

   Test 11: TEST OK [0.940 secs, 10528 KB]

   Test 12: TEST OK [0.173 secs, 8928 KB]

   Test 13: TEST OK [0.000 secs, 2920 KB]

  1. /*
  2. ID: millky
  3. PROG: stamps
  4. LANG: C++
  5. */
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9. #include <cmath>
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <vector>
  13. #include<iomanip>
  14. using namespace std;
  15. int *p;
  16. int k,n,v,value[50];
  17. int main()
  18. {
  19.     int temp,t;
  20.     freopen("stamps.in","r",stdin);
  21.     freopen("stamps.out","w",stdout);
  22.     scanf("%d%d",&k,&n);
  23.     for (int i=0;i<n;++i)scanf("%d",value+i);
  24.     temp=*max_element(value,value+n);
  25.     v=temp*k+1;
  26.     p=new int[v];
  27.     p[0]=0; 
  28.     for (int i=1;i<v;++i) p[i]=-1;
  29.     for(int i=0;i<n;++i) for (int j=value[i];j<v;++j)
  30.     {
  31.         t=j-value[i];
  32.         if (p[t]>-1 && p[t]<k)
  33.         {
  34.             if(p[j]<0) p[j]=1+p[t];
  35.             else p[j]=min(p[j],1+p[t]);
  36.         }
  37.     }
  38.     for (temp=1;temp<v && p[temp]>0;++temp);
  39.     printf("%d/n",temp-1);
  40.     return 0;
  41. }