标签:
1.题目描述:点击打开链接
2.解题思路:本题利用递推关系解决。建立一个多段图,定义状态d(i,j)表示“使用不超过i的整数的立方,累加和为j”的方案数。那么根据加法原理,如果没有选择数字i的立方和就得到了j,那么方案数就是d(i-1,j);如果选择了数字i的立方和才得到了j,那么方案数是d(i,j-i^3)。即:
d(i,j)=d(i-1,j)+d(i,j-i^3);
这个递推式还可以降低维度,利用滚动数组计算。由递推式可知,i,j都需要从小到大计算,而更新i的时候,d(j)保存的是第i-1次计算时的结果,此时可以用d(j)更新d(j+i^3)的状态。即只需要d(j+i^3)+=d(j)即可完成上述方程的计算。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> P; typedef pair<long long, long long> PL; #define me(s) memset(s,0,sizeof(s)) #define For(i,n) for(int i=0;i<(n);i++) #define N 10000+10 #define M 25 ll d[N]; void init() { me(d); d[0] = 1; for (int i = 1; i < M; i++) { int c = i*i*i; for (int j = 0; j < N; j++) { if (j + c < N) d[j + c] += d[j];//利用滚动数组计算,用d(j)去更新d(i+c) else break; } } } int main() { //freopen("t.txt", "r", stdin); int n; init(); while (cin >> n) { cout << d[n] << endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/u014800748/article/details/45849217