UVA Ingenuous Cubrency(11137)

题目大意:

       在10000以内的正整数中,有些数可以开3次方,给定一个正整数,可以由一些能够开3次方的数组成,求出共有几种组成方式。

 

解题思路:

       该题和硬币找零的题目相似,可以参考UVA Dollars(147)。先算出所有能够开3次方的数,这些数相当于可以用的硬币,后面的求法就和UVA Dollars(147)一样了。状态转移方程为:

dp[n] += dp[n-v[m]];

其中,dp[n] 表示组成 n 有几种方法,v[m] 存储所有能够开3次方的数。

 

代码:

 

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

long long dp[10010];

int main()
{
	int paid, cube = 1, k = 1, len;
	vector<int> v;
        
        //先求出10000以内能够开3次方的数
	do
	{
		v.push_back(cube);
		k++;
		cube = k * k * k;
	}while( cube <= 10000 );

	len = v.size();

	while( cin>>paid )
	{
		memset( dp, 0, sizeof( dp ) );
		dp[0] = 1;
		for( int m = 0; m < len; m++ )
		{
			for( int n = v[m]; n <= paid; n++ )
			{
				dp[n] += dp[n-v[m]];  //如果 n-v[m] 能够由那些开3次方的数组成,那么 n 也能由开3次方的数组成,只要不断进行累加,就可以算出 n 能有几种组成方式。
			}
		}

		cout<<dp[paid]<<endl;
	}

	return 0;
}

 

你可能感兴趣的:(uva)