先把$a$陣列排一下序。
從最小的數開始選,顯然最小這個數必須選,然後利用完全揹包的思想,從$a_i$到最大值篩選一遍,將可以組成的打上標記。
在判斷後面的數字時,如果已經被標記過了,就不再選,沒有被標記過就標記一下,再篩選一次數(即再做一次完全揹包)。
#include#define n 110
#define a 25010
using namespace std;
int t,n,ans,mmax;
int a[n];
bool vis[a];
void init()
void read()
return;
}void backpack()
ans++;
vis[a[i]]=1;
for(int j=a[i];j<=mmax;j++)
} }return;
}void print()
int main()
return 0;
}
Luogu P5020 貨幣系統
作為一道 noip 題,當然要考慮從部分分到正解,一是拿穩分防止正解寫掛,二是可以拿不同部分分的程式對拍。分析 看到樣例大膽猜想,或者考慮這個問題的本質。可以通過反證法證明新貨幣系統的集合一定是原貨幣系統的子集。考慮先把 a 系統的數全部選上,然後刪去一些,則這些刪去的一定可以被剩下的數都表示出來,...
題解 luogu P5020 貨幣系統
題目鏈結 玄學題目。可以用篩表,動規,搜尋做 篩表從小到大列舉,篩掉可以表示出來的數,剩下的數就是必須要選的 也就是答案 includeusing namespace std int dp 25005 t,a 105 n,sum intmain sort a 1,a 1 n for int i 1 ...
洛谷 5020 貨幣系統
題目描述 在的國度中共有 n 種不同面額的貨幣,第 iii 種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為 a 1 n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 都應該可以被表示出,即對每乙個非負整數 x,都存在 n ...