HAOI2010 計數(思維 組合數)

2021-09-25 22:54:27 字數 972 閱讀 3815

這道題個人認為有兩個較難的點:

①看起來很像,非常像,感覺是數字dp,但其實不是。。。。

②原題雖然說不可含前導0,但其實有前導0也是沒問題的,就比如說0012,12兩個是一樣的數。

如果明確這兩點之後,再加上組合數的一點知識,這道題就可以確定解題思路了。

思路:列舉。。。

怎麼列舉?看**吧。。

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

ll ans,c[55][55]; //c[i][j]表示組合數,c i取j

int a[10]=,digit[55],p; //a[i]表示數字i出現的次數

ll get_mul(int num)

return ret;

}void dfs(int pos,int num) //基本思路就是,從最高位k開始,假設最高位上限為up,列舉0~up,

//當最高為不為up時,假設為0,先把0填在這個位置,a[0]--,後面還有k-1個位置

//就可以先填0,再填1,2...9,總共有c[k-1][a[0]]*c[k-1-a[0]][a[1]]*...c[k-1-a[0]-...a[8]][a[9]的方案數(用上面get_mul函式求出來)

//當最高位為up時,a[up]--,跳至下一位k-1位列舉,假設此時最高位為up',重複上述操作,直到列舉完所有位數

else

}}int main()

ans=0;

dfs(p-1,p);

cout<最終還是把這道題歸到了數字dp的專題了,因為它實在太像了。。。藉此銘記,以後不被表面現象所迷惑。

另外,記得有些情況雖然不可帶前導0,但帶了也沒事的。

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

開始沒有看懂題,以為就是個樹形依賴揹包,打完之後w40,然後才發現它會有還,要用tarjan縮完點後跑揹包,要建立乙個虛擬節點0連線所有的子圖 注意連線的位置 錯誤示範 1 for int i 1 i n i 這樣會導致0連線的不是入度為0的點 或環 2if dsn i 3 正確 1 for int...