Genera un problema de función: HDU1398Square monedas

Descripción del problema
La gente en Silverland utilizan monedas cuadrados. No sólo tienen formas cuadradas, sino también sus valores son números cuadrados. Monedas con valores de todos los números de cuadrados hasta 289 (= 17 ^ 2), es decir, monedas de 1 crédito, monedas 4-crédito, monedas 9-crédito, monedas ..., y 289-crédito, están disponibles en Silverland.
Hay cuatro combinaciones de monedas para pagar créditos diez:
diez monedas de 1 crédito,
una moneda 4-crédito y seis monedas de 1 crédito,
dos monedas de 4 créditos y dos monedas de 1 crédito, y
una moneda de 9 créditos y un 1 -Crédito moneda.
Su misión consiste en contar el número de maneras de pagar una cantidad determinada usando monedas de Silverland.
Entrada
La entrada consiste en líneas que contienen cada uno un número entero que significa una cantidad a pagar, seguido de una línea que contiene un cero. Usted puede asumir que todas las cantidades son positivas y menos de 300.

Output
Para cada una de la cantidad dada, una línea que contiene un único número entero que representa el número de combinaciones de monedas debe ser de salida. No hay otros caracteres deben aparecer en la salida.

Ejemplo de entrada
2
10
30
0

Salida de muestra
1
4
27

Título significado general:
moneda de tipo 1 2,2 2,3 2,4 2 ... 17 ^ 2, estos tipos; n de entrada; se pueden combinar para determinar el número de combinaciones de n.

#include<stdio.h>
#include<string.h>
//#include <stdbool.h>
#include <algorithm>
#include<queue>
using  namespace std;
//HDU1398Square Coins
//题意: 硬币种类有1^2,2^2,3^2,4^2...17^2,这几种;输入n;求出能够组合成n的组合有多少种。
//也就是用母函数的话,第一组(x0 x1 x2...x17) 第二组的话 (x0 x2 x4 ...)
int main()
{
    //同理创建两个数组,一个用来存系数,一个用来存中间的值,并给他们赋初值,自我设置上限到400-1
    int c[400]={0};
    int temp[400]={0};
    int sum[18]={0};
    int i,j,k,n;
    //首先输入数组
    for(i=1;i<=17;i++){
        sum[i]=i*i;
    }
    //然后对第一组进行赋值,第一组可以从0到400
    for(i=0;i<400;i++){
        c[i]=1;
    }
    //然后开始计算,从第二组开始
    for(i=2;i<=17;i++){
        for(j=0;j<400;j++){//这个是前一项
            for(k=0;k+j<400;k+=sum[i]){
                temp[k+j]+=c[j];//这里是加等于
            }
        }
        //然后进行还原
        for(j=0;j<400;j++){
            c[j]=temp[j];
            temp[j]=0;
        }
    }
    //然后开始输入值
    while(scanf("%d",&n)!=EOF&&n!=0){
        printf("%d\n",c[n]);
    }

}

Publicado 72 artículos originales · ganado elogios 5 · Vistas 2817

Supongo que te gusta

Origin blog.csdn.net/qq_41115379/article/details/104914929
Recomendado
Clasificación