HDU - 1398 Square Coins (母函数)

本文介绍了一种算法,用于解决使用特定平方数值硬币支付任意金额的问题。通过逐步枚举并累加不同面额硬币的组合,最终得出支付指定金额的所有可能方式的数量。

People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available in Silverland. 
There are four combinations of coins to pay ten credits: 

ten 1-credit coins, 
one 4-credit coin and six 1-credit coins, 
two 4-credit coins and two 1-credit coins, and 
one 9-credit coin and one 1-credit coin. 

Your mission is to count the number of ways to pay a given amount using coins of Silverland. 
InputThe input consists of lines each containing an integer meaning an amount to be paid, followed by a line containing a zero. You may assume that all the amounts are positive and less than 300. 
OutputFor each of the given amount, one line containing a single integer representing the number of combinations of coins should be output. No other characters should appear in the output. 
Sample Input
2
10
30
0
Sample Output
1
4
27

题意:给你1个n,你有 1  4  9   16  25 ..... i^2 等元素,每个有无限个,现在问你你有几种方案,由任意个元素组成n

比如 

10    4种方案

1+9

1+1+....+1(10个)

4+1+.....+1(6个)

4+4+1+1

 解:c1[i]=j代表的是组成i的方案有j种,c2的意义和c1相同,不过c2是再引入1个新的元素后,方案的变化,然后我们把c2的值赋给c1,c2重新归零

比如 10

我们首先明白可以组成他的元素为  1,4,9,因为每个元素有无限个,不过我们得知道c1[0]=1,因为1个都不选也是一种状态

我们先拿出 元素k= 1  ,显然 for( i ,0 , 10)   c1[i] =1   唯一的方案就是 i 个1

然后拿出 元素 k=4   从 for(i,0,10),每个i 都可以 一直加k 直到值大于 10为止

0 :   c2[0]+=c1[0]     c2[4]+=c1[0]     c2[8]+=c1[0]

1:    c2[1]+=c1[1]    c2[5]+=c1[1]    c2[9]+=c1[1]

2 :    c2[2]+=c1[2]   c2[6]+=c1[2]  c2[10]+=c1[2]

............

然后我们把c2的值赋给c1,清空c2

拿出 元素  k=9   for(i,0,10) 每个i 都可以 一直加k 直到值大于 10为止

0:c2[0]+=c1[0]   c2[9]+=c1[0]  

............

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
int c1[330],c2[330];
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        for(int i=0;i<=n;i++)//元素 1 的情况
        {
            c1[i]=1;
            c2[i]=0;
        }
        for(int i=2;i*i<=n;i++)  //枚举小于等于n的元素
        {
            for(int j=0;j<=n;j++)//范围,因为最大只要到n即可
            {
                for(int k=0;k<=n;k+=i*i)//看最多能加几个当前元素
                {
                    c2[j+k]+=c1[j];  
                }
            }
            for(int j=0;j<=n;j++)//更新c1,c2
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        printf("%d\n",c1[n]);
    }
}





MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值