首先我們要想到,最後的最小的貨幣系統應該是原貨幣系統的乙個子集,原因也很簡單——如果a能夠用其他乙個或若干個面值表示那麼它顯然不必要,而如果你去引入乙個原來不存在的數那麼要麼是多於的(能被原來貨幣系統裡面的乙個或多個數表達)要麼就會引入新的東西。
所以現在我們要做到就是在剛剛的集合裡面求所有必要的無法被替代的貨幣數量。
顯然,最小的數肯定要留下,因為其他數字肯定表示不了它。
然後第二大的數,如果是最小的數的倍數就不需要,不是就得留下。
再考慮第三大的,假設前兩個數都留下了,顯然,如果它是前兩個數能組成的數那肯定就可以刪掉了。
依此類推,每個數如果能被小於它的數組成,就刪掉。
現在問題就變成了:給你若干個數,他們每個都可以使用無窮多次,問能組成的數有哪些——這不就是個典型的完全揹包麼?只是把最大價值變成可能性問題了而已,於是就很好解決了。
f[i]表示當前這個數x之前的數能不能組成i,如果f[x]等於1,那麼說明x可以刪了,刪掉即可;如果f[x]是0,那麼x不能刪,就按完全揹包的方式更新f陣列。
#includeusing namespace std;
int a[100005];
bool vis[100005];
int main()
}cout<}
return 0;
}
貨幣系統問題 (完全揹包)
貨幣是在國家或經濟體內的物資與服務交換中充當等價物,或是償還債務的特殊商品,是用作交易媒介 儲藏價值和記賬單位的一種工具。魔法世界的貨幣的歷史,可以追溯至史前以物易物的階段,後來經過金屬貨幣 金銀 紙幣以及金銀本位制度,演化至現代的貨幣體系,現已知魔法世界的貨幣系統有v種面值,求組成面值為n的貨幣有...
完全揹包 NOIP2018 貨幣系統
在的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為 a 1.n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 x 都應該可以被表示出,即對每乙個非負整數 x 都存在 n 個非負整數...
2018NOIP提高組 貨幣系統(完全揹包)
貨幣系統 在的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為 a 1.n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 x 都應該可以被表示出,即對每乙個非負整數 x,都存在 n ...