pascal 信息学奥赛编程 50分跪求

[复制链接]
查看11 | 回复3 | 2009-7-19 19:51:10 | 显示全部楼层 |阅读模式
其实这个题应该以和的大小来划分状态,f表示最大的数是n时,有一个集合和为s的方法总数,于是用一层循环来表示目前的最大数是多少,不妨设是i,这样f就只与f[s-i]有关,这样状态转移方程就出来了……
事实上,仔细观察可发现,对于每个有解的数i,经过它时,f[i*(i+1) div 4]总是他的真实值得二倍(有且只有这个数),这是为什么呢?这是因为这个数从正反两方面个算了一次,而且正是这种“错误”,导致了下一次引用它时,由于把i+1放入目前的哪个集合中都可以,于是应该是真实值的二倍,这样正好避免了麻烦!这正是这种算法的精妙所在!!最终的结果只要f[n*(n+1) div 4] div 2就可以了!!标程如下:...
回复

使用道具 举报

千问 | 2009-7-19 19:51:10 | 显示全部楼层
数据规模 比较 小 可以考虑用 dp 做 背包问题 容量 为total div 2 (如果 not odd(tot))tot 为奇数 那无解。 然后 算出 装满 total div 2 的总方案数。 应为 左右调换 是同一种情况 结果 就 div 2...
回复

使用道具 举报

千问 | 2009-7-19 19:51:10 | 显示全部楼层
typeaa=array[0..100]of integer;varn,m,i,j:longint;a:array[0..100,0..100]of aa;procedure chen(i:integer;var a:aa);varj,x:integer;beginx:=0;for j:=1 t...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行