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 的揹包,有幾種方法呢?這是經典的問題了。...