zoukankan      html  css  js  c++  java
  • usaco-5.3-milk4-passed

    这个要用动态规划,呵呵:

    这道题要用到迭代加深搜索(DFSID)。由于要求输出的是使用最少的牛奶桶,所以要先找牛奶桶数量为1的时候所有的组合,如果没有解再找牛奶桶数量为2...直到牛奶桶数量为P。

    当搜索到一个组合,判断用这些牛奶桶是否能组成目标解的时候,可以用动态规划的方法来做。设f[i]是当需求的牛奶为i时,能否形成这个组合,是一个布尔型数组。 初始条件 f[0]=true 状态转移方程 f[i]=f[i] or f[ i-v[j] ] (j为使用的所有牛奶桶) 目标状态 f[Q] 如果f[Q]为true,则当前解合法,直接输出即可。

    但是如果仅仅这样写还是有一组数据过不去,需要进行一些优化。要优化动态规划的过程。 注意一个重要的信息,找到的组合中,每个牛奶桶至少用了一次。上面的状态转移方程中有许多某个牛奶桶使用0次的冗余状态。可以在初始的时候对(i=1..Q/v[第一个桶]) f[ i*v[第一个桶] ]赋值为true。对每个其他的桶的状态可以直接由前面的状态得出。

    /*
    ID: qq104801
    LANG: C++
    TASK: milk4
    QQ:104804687
    */
    
    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    #define loop(i,n) for(int i=0;i<(n);i++)
    #define loop2(i,n) for(int i=1;i<=(n);i++)
    const int maxp=101;
    const int maxq=20001;
    const int inf=1<<30;
    
    int q,p,ans,v[maxp],use[maxp];
    
    int cmp(const void *a,const void *b)
    {
      return *(int*)a<*(int*)b?-1:1;
    }
    
    void print()
    {
      cout<<ans;
      loop2(i,ans)
        cout<<' '<<v[use[i]];
      cout<<endl; 
      exit(0); //here exit,halt
    }
    
    void judge()
    {
      int i,j;
      bool f[maxq];
      memset(f,0,sizeof(f));
      for(i=1;i<=q/v[use[1]];i++)
        f[i*v[use[1]]]=true;
      for(i=2;i<=ans;i++)
        for(j=v[use[i]];j<=q;j++)
          f[j] |=f[j-v[use[i]]];
      if(f[q])
        print();
    }
    
    void dfs(int k)
    {
      int i,j;
      for(i=use[k-1]+1;i<=p-ans+k;i++)
      {
        use[k]=i;
        if(k==ans)
          judge();
        else
          dfs(k+1);
      }
    }
    
    void test()
    {   
      freopen("milk4.in","r",stdin);  
      freopen("milk4.out","w",stdout); 
      cin>>q>>p;
      loop2(i,p)
        cin>>v[i];
      qsort(v+1,p,sizeof(v[0]),cmp);
    
      for(ans=1;ans<=p;ans++)
        dfs(1);
    }
    
    int main () 
    {        
        test();        
        return 0;
    }

    test data:

    USACO Training
    Grader Results     
    31 users online
    CHN/9 GEO/10 IRN/1 MYS/1 TUR/1 USA/9
    
    USER: cn tom [qq104801]
    TASK: milk4
    LANG: C++
    
    Compiling...
    Compile: OK
    
    Executing...
       Test 1: TEST OK [0.003 secs, 3376 KB]
       Test 2: TEST OK [0.008 secs, 3376 KB]
       Test 3: TEST OK [0.005 secs, 3376 KB]
       Test 4: TEST OK [0.008 secs, 3376 KB]
       Test 5: TEST OK [0.005 secs, 3376 KB]
       Test 6: TEST OK [0.008 secs, 3376 KB]
       Test 7: TEST OK [0.078 secs, 3376 KB]
       Test 8: TEST OK [0.016 secs, 3376 KB]
       Test 9: TEST OK [0.008 secs, 3376 KB]
       Test 10: TEST OK [0.076 secs, 3376 KB]
    
    All tests OK.
    
    YOUR PROGRAM ('milk4') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
    
    Here are the test data inputs:
    
    ------- test 1 [length 11 bytes] ----
    16
    3
    3
    5
    7
    ------- test 2 [length 11 bytes] ----
    20
    3
    1
    2
    4
    ------- test 3 [length 13 bytes] ----
    59
    3
    7
    11
    13
    ------- test 4 [length 13 bytes] ----
    8722
    2
    89
    97
    ------- test 5 [length 25 bytes] ----
    323
    5
    97
    101
    103
    107
    119
    ------- test 6 [length 20 bytes] ----
    20000
    3
    233
    151
    413
    ------- test 7 [length 509 bytes] ----
    5334
    100
    1009
    1013
    1019
    1021
    1031
    1033
    1039
    1049
    1051
    1061
    1063
    1069
    1087
    1091
    1093
    1097
    1103
    1109
    1117
    1123
    1129
    1151
    1153
    1163
    1171
    1181
    1187
    1193
    1201
    1213
    1217
    1223
    1229
    1231
    1237
    1249
    1259
    1277
    1279
    1283
    1289
    1291
    1297
    1301
    1303
    1307
    1319
    1321
    1327
    1361
    1367
    1373
    1381
    1399
    1409
    1423
    1427
    1429
    1433
    1439
    1447
    1451
    1453
    1459
    1471
    1481
    1483
    1487
    1489
    1493
    1499
    1511
    1523
    1531
    1543
    1549
    1553
    1559
    1567
    1571
    1579
    1583
    1597
    1601
    1607
    1609
    1613
    1619
    1621
    1627
    1637
    1657
    1663
    1667
    1669
    1693
    1697
    1699
    1709
    1721
    ------- test 8 [length 508 bytes] ----
    15383
    100
    997
    998
    1000
    1003
    1007
    1012
    1018
    1025
    1033
    1042
    1052
    1063
    1075
    1088
    1102
    1117
    1133
    1150
    1168
    1187
    1207
    1228
    1250
    1273
    1297
    1322
    1348
    1375
    1403
    1432
    1462
    1493
    1525
    1558
    1592
    1627
    1663
    1700
    1738
    1777
    1817
    1858
    1900
    1943
    1987
    2032
    2078
    2125
    2173
    2222
    2272
    2323
    2375
    2428
    2482
    2537
    2593
    2650
    2708
    2767
    2827
    2888
    2950
    3013
    3077
    3142
    3208
    3275
    3343
    3412
    3482
    3553
    3625
    3698
    3772
    3847
    3923
    4000
    4078
    4157
    4237
    4318
    4400
    4483
    4567
    4652
    4738
    4825
    4913
    5002
    5092
    5183
    5275
    5368
    5462
    5557
    5653
    5750
    5848
    5947
    ------- test 9 [length 104 bytes] ----
    19829
    20
    708
    727
    764
    825
    916
    1043
    1212
    1429
    1700
    2031
    2428
    2897
    3444
    4075
    4796
    5613
    6532
    7559
    8700
    9961
    ------- test 10 [length 471 bytes] ----
    16737
    94
    904
    909
    916
    925
    936
    949
    964
    981
    1000
    1021
    1044
    1069
    1096
    1125
    1156
    1189
    1224
    1261
    1300
    1341
    1384
    1429
    1476
    1525
    1576
    1629
    1684
    1741
    1800
    1861
    1924
    1989
    2056
    2125
    2196
    2269
    2344
    2421
    2500
    2581
    2664
    2749
    2836
    2925
    3016
    3109
    3204
    3301
    3400
    3501
    3604
    3709
    3816
    3925
    4036
    4149
    4264
    4381
    4500
    4621
    4744
    4869
    4996
    5125
    5256
    5389
    5524
    5661
    5800
    5941
    6084
    6229
    6376
    6525
    6676
    6829
    6984
    7141
    7300
    7461
    7624
    7789
    7956
    8125
    8296
    8469
    8644
    8821
    9000
    9181
    9364
    9549
    9736
    9925
    View Code
    /***********************************************

    看书看原版,原汁原味。

    不会英文?没关系,硬着头皮看下去慢慢熟练,才会有真正收获。

    没有原书,也要网上找PDF来看。

    网上的原版资料多了去了,下载东西也到原始下载点去看看。

    你会知其所以然,呵呵。

    ***********************************************/

  • 相关阅读:
    面向对象编程的三大特征: 封装、继承、多态
    CDH和HDP对比
    mapreduce、spark、tez区别
    minio原理和使用
    HDP、CDH、CDP升级
    常用的分布式文件系统
    linux平台下防火墙iptables原理(转)
    php 1207
    php 1209
    php 1130
  • 原文地址:https://www.cnblogs.com/dpblue/p/4041615.html
Copyright © 2011-2022 走看看