背包问题,或者说 DAG上的动态规划,固定终点的最短路问题 .(参见lrj《算法竞赛入门经典》)
题目有点像硬币问题,可以直接用dp解决.
[方程]
f[a1][a2][a3][a4][a5] = min{f[a1-p[i][1][a2-p[i][2][a3-p[i][3][a4-p[i][4]][a5-p[i][5]+p[i][0]}
(0<i<=s, ak-p[i][k]>=0,p[i][0]是优惠后的价格)
[状态设置]
f[a1][a2][a3][a4][a5]为买a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5时,所需的最少价格
[边界条件] f[0][0][0][0][0]=0;
USACO官方解法很有启发性,用最短路,把每种状态[a1][a2][a3][a4][a5](a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5)看成一个点,则至多7776个点,而每个优惠就是一条边,则至多105条边。 接下来就是求[0,0,0,0,0]到目标状态的最短路,用Dijkstra(Heap优化)即可.
Executing...
Test 1: TEST OK [0.011 secs, 3408 KB]
Test 2: TEST OK [0.000 secs, 3408 KB]
Test 3: TEST OK [0.000 secs, 3408 KB]
Test 4: TEST OK [0.011 secs, 3408 KB]
Test 5: TEST OK [0.000 secs, 3408 KB]
Test 6: TEST OK [0.000 secs, 3408 KB]
Test 7: TEST OK [0.000 secs, 3408 KB]
Test 8: TEST OK [0.000 secs, 3408 KB]
Test 9: TEST OK [0.000 secs, 3408 KB]
Test 10: TEST OK [0.022 secs, 3408 KB]
Test 11: TEST OK [0.022 secs, 3408 KB]
Test 12: TEST OK [0.011 secs, 3408 KB]
All tests OK.
Your program ('shopping') produced all correct answers! This is your submission #2 for this problem. Congratulations!