是不是很熟悉的開頭,哈哈,畢竟乙隻蒟蒻第一次寫題解多少有點緊張啊…
(本題來自hloj#1949)
好了,切入正題…
題面意思呢,就是給你n個物品,乙個m的揹包,接下來是w[i]表示每個物品的重量,看起來很簡單,不過呢,有乙個物品丟了,你要輸出乙個**,**橫排的數值表示丟了第i個物品,縱列的數值表示要來填滿乙個容積為x的揹包這裡1<=x<=m,在所在位置輸出方案數。
emmm…相信各位大佬第一眼看到這題就想用01揹包過,所以貼上**,要抄**的小盆友有請,你的任務完成了!
#include
using
namespace std;
int n,m;
int a[
2005
],f[
2005]=
;long
long sum[
2005][
2005];
//第一維表示執行到了i個,第二維表示目前揹包容積
intmain()
for(
int i=
1;i<=n;i++
)return0;
}
//感謝gzw大佬友情提供的**(雖然是tle的,但也是很好的例子)。
不過呢…沒錯,你每個點跑了n遍,但最後還是超時了…
畢竟最後兩個資料真的…很強…
所以——換策略吧。
int f[max][2] ,用 f[i][0] 表示不算消失的物品能組成容積為i的方案數, f[i][1] 表示物品消失後能組成容積為i的方案數。
//想問怎麼轉移?詳情請見底下**。
初始化 f[0][0]=f[0][1]=1 ,因為組成容積為0的方案數必定為1。
好了,**實現…
#include
using
namespace std;
int n,m,w[
2010
],f[
2010][
2]=;
intmain()
for(
int i=
1;i<=n;i++
)//這步用來轉移f[j][1],j表示容積,i表示物品序號
cout/換行別忘了
}return0;
}
別想了,沒坑。我這麼好心,怎麼可能讓你填坑呢?要抄**的小盆友有請,不過我想抄了對自己也沒多少用吧,至少你得看懂啊,不然人家問你怎麼辦(雖然這題其實並不難)。
**有點醜,請各位大佬不要介意,如果各位大佬發現什麼錯誤或者有什麼改進意見歡迎提出。
消失之物,分治
ftiasch 有 n 個物品,體積分別是 w1,w2,wn。由於她的疏忽,第 i 個物品丟失了。要使用剩下的 n 1 物品裝滿容積為 x 的揹包,有幾種方法呢?這是經典的問題了。她把答案記為 count i,x 想要得到所有1 i n,1 x m的 count i,x view code 輸入格式...
POJ Challenge消失之物
ftiasch 有 n 個物品,體積分別是 w1 w2 wn 由於她的疏忽,第 i 個物品丟失了。要使用剩下的 n 1 物品裝滿容積為 x 的揹包,有幾種方法呢?這是經典的問題了。她把答案記為 count i,x 想要得到所有1 i n,1 x m的 count i,x 第1行 兩個整數 n 1 n...
BZOJ2287消失之物
dpdpdpdpdpdpdpdp 討厭dp 這道題看起來很難 實際上也很難 思路 我們要求拿走一件物品之後的方案數,那麼肯定會涉及到不拿走的情況,那麼不拿走的情況是什麼呢?用前i件物品拼成體積j的方案數,所以我們要先預處理一下這個初始陣列f i 也就是一件都不拿走的情況 之後呢?我們考慮如何轉移拿走...