Square Coins一个DP问题分析

问题描述:
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.

Input

The 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.

Output

For 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
问题分析:
 
cpp 代码
  1. #include<iostream></iostream>   
  2. using namespace std;   
  3.   
  4. int w[18][301];   
  5.   
  6. void NumOfMethod(){   
  7.      int i,j,k;   
  8.     /*初始化w的值,用<=1币值显然有一种方法,j=0初始化为1的原因是,  
  9.       w[i][j] += w[i-1][j-k*i*i],如果j-k*i*i == 0,即用k个币值为  
  10.       i*i的硬币恰好可以替换所有的所有的硬币来支付,这个方法数是1而不是0,  
  11.       这比较特殊,与用<=(i-1)*(i-1)币值的钱来付j-k*i*i的方法数不相等*/  
  12.   
  13.     for(i = 1; i < 18; i++)   
  14.         for(j = 0; j < 301; j++){   
  15.            if(i == 1 || j == 0)   
  16.                w[i][j] = 1;   
  17.            else  
  18.                w[i][j] = 0;   
  19.         }   
  20.     //下面就是从底往上推的一个过程了:   
  21.     for(i = 2; i < 18; i++)   
  22.         for(j = 1; j < 301; j++)   
  23.             for(k = 0; j-k*i*i >= 0; k++)   
  24.                 w[i][j] += w[i-1][j-k*i*i];   
  25.        
  26. }   
  27. int main(){   
  28.     int n;   
  29.     NumOfMethod();   
  30.     while(cin>>n,n){   
  31.       cout << w[17][n] << endl;   
  32.     }   
  33.     return 0;   
  34. }  

 

     当然如果想节省空间可以用两个一维的数组交替使用来替换掉w那个二维数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值