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

 

posted on 2014-10-21 21:26  深蓝无忌  阅读(247)  评论(0编辑  收藏  举报

导航