題解 luogu P5020 貨幣系統

2022-09-18 02:30:37 字數 1117 閱讀 2585

題目鏈結

玄學題目。。。。可以用篩表,動規,搜尋做

篩表從小到大列舉,篩掉可以表示出來的數,剩下的數就是必須要選的(也就是答案)。

#includeusing

namespace

std;

int dp[25005], t, a[105

], n, sum;

intmain()

sort(a+1, a+1+n);

for(int i = 1; i <= a[n]; i++)

}for(int i = 1; i <= a[n]; i++)

if(dp[i] == 2) sum++;

cout

<< sum <}

return0;

}

動態規劃

/*

狀態 m, dp[i]

dp[i]代表面值為i的紙幣最多有幾種表示

注意這是個剛好裝滿的完全揹包問題(注意初始化)

dp[i] = max(dp[i], dp[i-a[i]]+1);

*/#include

#include

#include

#include

using

namespace

std;

int a[105], n, q[30000

], t, ans;

intmain()

return0;

}

啟示:剛好裝滿問題中

1.將dp[i] 初始化為-inf ,dp[i] = max(dp[i], dp[i-a[i]]+1);

2.沒有初始化dp[i],需要再加一層迴圈,極大的增加複雜度。

//記憶化搜尋

#includeusing

namespace

std;

int a[105], cnt, vis[25005], ans, t, x, n, f[25005

];void dfs(int now, int sum, int

x) }

}int

main()

return0;

}

Luogu P5020 貨幣系統

先把 a 陣列排一下序。從最小的數開始選,顯然最小這個數必須選,然後利用完全揹包的思想,從 a i 到最大值篩選一遍,將可以組成的打上標記。在判斷後面的數字時,如果已經被標記過了,就不再選,沒有被標記過就標記一下,再篩選一次數 即再做一次完全揹包 include define n 110 defin...

Luogu P5020 貨幣系統

作為一道 noip 題,當然要考慮從部分分到正解,一是拿穩分防止正解寫掛,二是可以拿不同部分分的程式對拍。分析 看到樣例大膽猜想,或者考慮這個問題的本質。可以通過反證法證明新貨幣系統的集合一定是原貨幣系統的子集。考慮先把 a 系統的數全部選上,然後刪去一些,則這些刪去的一定可以被剩下的數都表示出來,...

luogu P1816 忠誠 題解

用st表來解決rmq問題。表示同時培訓學的st表,然後我就忘得差不多了,在這裡推薦一篇blog 大佬cym的 自己再 一篇 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp...