消失之物(永远撸不完的背包)

消失之物(thing.pas/c/cpp)
【问题描述】
yd有 N 个物品, 体积分别是 W1, W2, ..., WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了。他把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。
【输入格式】
第1行:两个整数 N  和 M ,物品的数量和最大的容积。
第2行: N 个整数 W1, W2, ..., WN, 物品的体积。
【输出格式】
一个 N × M 的矩阵, Count(i, x)的末位数字。
【样例输入】
3 2
1 1 2
【样例输出】
11
11
21
【数据规模】
10% n <= 20 m <= 100
50% n <= 500 m <= 500
80% n <= 1000 m <= 1000
100% n <= 2000 m <= 2000

题解:

下面这是正常的式子:

f[i][j]=f[i-1][j]+f[i-1][j-w[i]](不放i个数+放i个数)

但是你一行一行这么干撸肯定TLE,要有想法的撸(丧失……)

设g[i][j]就为结果那个矩阵,即g[i][j]表示除去i,剩下的填满j容量背包的方案数

则有g[i][j]=f[n][j]-g[i][j-w[i]]

这个式子就相当做第i行时于把上面f那个式子的后面的放的个数给减掉了……太巧妙了

本蒟残首先想的是撸出第一行看看能不能递推出后面,但是发现想多了……

后来蒟残想没行只做那一个,也就是和题解思路差不多,但是蒟残没想到减……发现开个3维记下子好像可以但是要MLE……所以挂了……

posted @ 2014-02-09 21:02  Chellyutaha  阅读(344)  评论(0编辑  收藏  举报