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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值