BZOJ 2281 消失之物

2022-05-12 11:52:42 字數 1336 閱讀 6891

ftiasch 有 n 個物品, 體積分別是 w1, w2, …, wn。 由於她的疏忽, 第 i 個物品丟失了。 「要使用剩下的 n – 1 物品裝滿容積為 x 的揹包,有幾種方法呢?」 — 這是經典的問題了。她把答案記為 count(i, x) ,想要得到所有1 <= i <= n, 1 <= x <= m的 count(i, x) **。

input

第1行:兩個整數 n (1 ≤ n ≤ 2 × 103) 和 m (1 ≤ m ≤ 2 × 103),物品的數量和最大的容積。

第2行: n 個整數 w1, w2, …, wn, 物品的體積。

output

乙個 n × m 的矩陣, count(i, x)的末位數字。

sample input

3 2

1 1 2

sample output

11 11

21 hint

如果物品3丟失的話,只有一種方法裝滿容量是2的揹包,即選擇物品1和物品2。

如果每次都去掉乙個並跑揹包,時間複雜度為o(mn^2),會t。
#include

using

namespace

std;

const

int maxn = 2005;

int n,m,dp[maxn];

int a[maxn];

int main()

}for(register

int j=1;j<=m;j++)

printf("%d",dp[j]%10);

printf("\n");

}return

0;}

下面我們說正解,其實也不是那麼難想

對於每個i只要`

for(register int j=a[i];j<=m;j++)`

#include

using

namespace

std;

const

int maxn = 2005;

int n,m,dp[maxn],g[maxn];

int a[maxn],cnt[maxn][maxn];

bool vis[maxn];

int main()

for(int i=1;i<=n;i++)

for(register

int j=1;j<=m;j++)

printf("%d",g[j]%10);

printf("\n");

}return

0;}

bzoj2281 黑白棋 博弈論

這道題目的轉化真是巧妙啊。不過據說題目有點問題,那就不管了。首先將第i個白子和第i個黑子組成一對。那麼這一對中,白子的左移是沒有意義的,黑子的右移也是沒有意義的 雖然有反例,但好像只能這樣了 那麼每一對黑子和白子可以看成一堆火柴,則問題轉化為一次在d堆中拿火柴的必勝策論。對於d nim 就這麼叫了 ...

BZOJ2287消失之物

dpdpdpdpdpdpdpdp 討厭dp 這道題看起來很難 實際上也很難 思路 我們要求拿走一件物品之後的方案數,那麼肯定會涉及到不拿走的情況,那麼不拿走的情況是什麼呢?用前i件物品拼成體積j的方案數,所以我們要先預處理一下這個初始陣列f i 也就是一件都不拿走的情況 之後呢?我們考慮如何轉移拿走...

BZOJ2287 消失之物 分治 DP

time limit 10 sec memory limit 128 mb submit status discuss ftiasch 有 n 個物品,體積分別是 w1 w2 wn 由於她的疏忽,第 i 個物品丟失了.要使用剩下的 n 1 物品裝滿容積為 x 的揹包,有幾種方法呢?這是經典的問題了。...