hdu1398(多种n个硬币组合)

这道题和hdu1086一样都用的是母函数

题意是对于无数个各种面值(1,4,9.......17^17)的硬币

给出一个数字问这些硬币组成这个数字有多少种组成方式

实际上对于v1[n]

n就是指硬币们组成的数字,v1[n]就是组成这个数字的方法数


//

//  main.cpp

//  1398

//

//  Created by Mr.Xue on 17/7/17.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//


#include <iostream>

using namespace std;

int val[20];

int v1[1000],v2[1000];

int main()

{

    int t;

    for(int i=1;i<=17;i++)

        val[i-1]=i*i;

    memset(v1,0,sizeof(v1));

    for(int i=0;i<=300;i++)

        v1[i]=1;

    for(int i=1;i<17;i++)

    {

        for(int j=0;j<=300;j++)

        {

            if(v1[j]!=0)

            {

                for(int k=0;k<=300;k=k+val[i])

                {

                    if(j+k<=300)

                        v2[k+j]+=v1[j];

                }

            }

        }

        memcpy(v1,v2,sizeof(v2));

        memset(v2,0,sizeof(v2));

    }

    while(scanf("%d",&t)&&t!=0)

    {

        printf("%d\n",v1[t]);

    }

    return 0;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值