hdu1085Holding Bin-Laden Captive!组合问题
題目連接
題目意思:有單位價值為1 2 5的三種硬幣,分別給出他們的數量,求用這些硬幣不能組成的最小的價值
解題思路:普通的母函數
普通的母函數:
利用母函數的思想可以解決很多組合問題,下面舉例說明:
1.口袋中有白球2個,紅球3個,黃球1個,從袋中摸出3個球有幾種取法?
? 和上面描述的例子類似,我們可以用次數代表球的個數,多項式的每一項前面的系數代表取法的種樹。
可以很容易地寫出下面這個式子:
(1+x+x2)(1+x+x2+x3)(1+x)
? (1+x+x2)表示有白球2個,1(1可以看做是x的0次方)表示白球不取,x代表取1個白球,x2代表取2個白球,即用x的次數表示取球的個數,后面的也是類似。那么這個多項式的乘積就把所有的情況都表示出來了,對于最終乘積的每一項anxn,表示取n個球有an種取法。
?
? ? 2.有若干個1克,2克,5克的砝碼,要稱出20克的重量,有多少種稱法?
這里不限制砝碼的個數,無所謂,照樣寫出母函數:
(1+x+x2+x3+......xk+....)(1+x2+x4+x6......+x2n+......)(1+x5+x10+......x5m+......)
因為要稱出20克,所以只需要找找到結果中次數為20 的那一項就可以得到結果。
? ? 3.同樣對于正數劃分也可以解決,比如有整數20,劃分成1,2,5,有多少種劃分方法?
解法和2的類似。
? ? ?還有一類題目和這類似,有n個球放到m個盒子中,有多少種不同的放法?
? ? (1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)總共有m項,然后找出乘積中次數為n的那一項系數。
代碼實現:
模擬多項式的乘積過程,c[i]表示次數為i的系數,成tempc[]數組是一個暫存數組
該題的母函數不難得出是(1+x+x2+x3+......xk+....)(1+x2+x4+x6......+x2n+......)(1+x5+x10+......x5m+......)
對于單位價值為1的硬幣,不去次數為0,取一個次數為1,取兩個次數為2.。。。。。
對于單位價值為2的硬幣,不去次數為0,取一個次數為2,取兩個次數為4.。。。。。
對于單位價值為5的硬幣,不去次數為0,取一個次數為5,取兩個次數為10.。。。。。
普通母函數的精髓就是將組合問題通過次數及系數來表示在某次組合中的選擇是怎樣的,如分別選擇多少個什么種類的東西
c[]數組初始化為第一個多項式乘積因子(1+x+x2+x3+......xk+....)的相應次數的系數
tempc[]數組暫存多項式乘積因子(1+x+x2+x3+......xk+....)與多項式乘積因子(1+x2+x4+x6......+x2n+......)相乘后相應的次數的系數,并賦給c[]數組。
注意:此時c[]數組存儲的是多項式乘積因子(1+x+x2+x3+......xk+....)與多項式乘積因子(1+x2+x4+x6......+x2n+......)相乘后相應的次數的系數。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int main() 8 { 9 int cent[3]={1,2,5}; 10 int i,j,k,num[3],c[8005],tempc[8005]; 11 while(~scanf("%d%d%d",&num[0],&num[1],&num[2])) 12 { 13 if(num[0]==0&&num[1]==0&&num[2]==0)break; 14 int max=num[0]+num[1]*2+num[2]*5; 15 memset(c,0,sizeof(c)); 16 memset(tempc,0,sizeof(tempc)); 17 for(i=0;i<=num[0]*cent[0];i+=cent[0]) 18 c[i]=1; 19 for(i=1;i<3;i++) 20 { 21 for(j=0;j<=max;j++) 22 for(k=0;k+j<=max&&k<=cent[i]*num[i];k+=cent[i]) 23 tempc[k+j]+=c[j]; 24 for(j=0;j<=max;j++) 25 { 26 c[j]=tempc[j]; 27 tempc[j]=0; 28 } 29 } 30 for(i=0;i<=max;i++) 31 { 32 if(c[i]==0)break; 33 } 34 printf("%d\n",i); 35 } 36 return 0; 37 }?
轉載于:https://www.cnblogs.com/WHLdbk/p/6361362.html
總結
以上是生活随笔為你收集整理的hdu1085Holding Bin-Laden Captive!组合问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AC日记——任务查询系统 洛谷 P316
- 下一篇: mac下导出kindle单词本的单词