消失之物 s 題解

2021-09-17 01:58:53 字數 1293 閱讀 8482

是不是很熟悉的開頭,哈哈,畢竟乙隻蒟蒻第一次寫題解多少有點緊張啊…

(本題來自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 也就是一件都不拿走的情況 之後呢?我們考慮如何轉移拿走...