简单动态规划

Square Coins

 ZOJ - 1666 

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

本题属于动态规划完全背包的内容,即在不限制数量的情况下用某几种物品装满一个背包。

AC代码

#include
using namespace std;

int main()
{
	int a[310],b[310];
	for(int i=1;i<=17;i++)
		a[i]=i*i;
	memset(b,0,sizeof(b));
	b[0]=1;
	//数据量较小先行打表 
	for(int i=1;i<=17;i++)
		for(int j=a[i];j<=300;j++)
		//状态转移方程,完全背包。即不限制硬币数量的情况下如何用各类硬币凑出一个数。 
			b[j]+=b[j-a[i]];
	int n;
	while(cin>>n&&n)
	printf("%d\n",b[n]);
	return 0;
}

 

 

 

你可能感兴趣的:(dp)