1. 程式人生 > 其它 >Hdu 1085 Holding Bin-Laden Captive! —— 母函式

Hdu 1085 Holding Bin-Laden Captive! —— 母函式

技術標籤:數學

This way

題意:

給你一些硬幣,價值為1,2,5,問你它們的和中第一個不能構造出來的數是多少

題解:

最高價值為8000,那麼將上限調到這,依舊是個模板題
∏ i = 1 n ( 1 + i v [ i ] + i 2 v [ i ] + . . . ) \prod\limits_{i=1}^{n}(1+i^{v[i]}+i^{2v[i]}+...) i=1n(1+iv[i]+i2v[i]+...)

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int
N=8005; ll dp[2][N]; int a[5],v[5]; int main() { v[1]=1,v[2]=2,v[3]=5; while(~scanf("%d%d%d",&a[1],&a[2],&a[3])){ if(!(a[1]+a[2]+a[3]))return 0; //int lim=a[1]+2*a[2]+5*a[3]; int f=0; memset(dp[f],0,sizeof(dp[f])); dp[f][0]=1; int
top=0; for(int i=1;i<=3;i++){ int nt=top+a[i]*v[i]; memset(dp[f^1],0,sizeof(ll)*(nt+2)); for(int j=0;j*v[i]<=nt&&j<=a[i];j++) for(int k=0;k<=top&&k+j*v[i]<=nt;k++) dp[f^1][k+j*v[i]]+=dp[f][k];
f^=1; top=nt; } int ans=0; for(int i=1;i<N;i++){ if(!dp[f][i]){ ans=i; break; } } printf("%d\n",ans); } return 0; }