日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu1085Holding Bin-Laden Captive!组合问题

發布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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!组合问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。