为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

USACO/shopping

来自NOCOW
跳转到: 导航, 搜索

[编辑] 分析

说真的,考的是编程复杂度。

0 <= b <= 5,1 <= k <= 5,可用5*5*5*5*5的DP 每种买0~5个,可以用6进制表示,然后5维DP~OK!

状态设置:F[a1][a2][a3][a4][a5]为买a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5时,所需的最少价格

边界条件:F[0][0][0][0][0]=0;

状态转移方程:
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]}
其中i=1..s+b; 且 ak-p[i][k]>=0


--CmYkRgB123 20:09 2008年4月17日 (CST)

其实这道题用dfs加一些优化也可以过。

用一个五维数组纪录每个已搜索过的状态和该状态所需要的钱数,如果搜索出了有重复状态并且所需要的钱数更多就剪枝。但是单纯这种方法最多只能通过第9个点。 因为这种方法对数据的顺序有要求,所以可以在读入的时候将数据随机化排列,我用的倒序排列。


我的解法是基于压缩的背包。(类多串lcs) 化多维为一维,个人认为可拓展性比较强,就是程序长了点。速度也不慢(而且我还有一个优化懒得加了……)

[编辑] 参考代码

C
C++
Pascal
Java

[编辑] 链接

[1]

个人工具