标签:style blog http color io os ar 使用 for
这个要用动态规划,呵呵:
这道题要用到迭代加深搜索(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
标签:style blog http color io os ar 使用 for
原文地址:http://www.cnblogs.com/dpblue/p/4041615.html