這道題個人認為有兩個較難的點:
①看起來很像,非常像,感覺是數字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...