UVA 11137 Ingenuous Cubrency
2013-09-06 11:36
429 查看
题目来源:UVA 11137
原题概述:
将n表示成多个立方数之和,问有多少种表示方式?
如:21可表示为21个1、1个8+13个1、2个8+5个1,共3种方式。
分析:
这是一道多重背包问题的变形,容量为累加和,第i个数的代价为i^3,价值为方法数。用d(i,j)表示“只使用前i个整数的立方,累加和为j”的方法数。
状态转移方程为:d(i,j)=sum{ d(i-1,j-k*i^3) | 0<=k*i^3<=j } 也可表示为:d(i,j)=d(i-1,j)+d(i,j-i^3);
利用滚动数组可降低空间复杂度,时间复杂度为O(VN)=21*10000,(22^3>10000),已经是很优化的了。
个人体会:
只要加深对基础背包问题的理解,仍其千变万化,都能找的解决方法。
代码:
原题概述:
将n表示成多个立方数之和,问有多少种表示方式?
如:21可表示为21个1、1个8+13个1、2个8+5个1,共3种方式。
分析:
这是一道多重背包问题的变形,容量为累加和,第i个数的代价为i^3,价值为方法数。用d(i,j)表示“只使用前i个整数的立方,累加和为j”的方法数。
状态转移方程为:d(i,j)=sum{ d(i-1,j-k*i^3) | 0<=k*i^3<=j } 也可表示为:d(i,j)=d(i-1,j)+d(i,j-i^3);
利用滚动数组可降低空间复杂度,时间复杂度为O(VN)=21*10000,(22^3>10000),已经是很优化的了。
个人体会:
只要加深对基础背包问题的理解,仍其千变万化,都能找的解决方法。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<stack> #include<cmath> #include<algorithm> #include<cstdlib> #include<stack> #include<map> #include<vector> typedef long long LL; using namespace std; const int INF=0x3f3f3f3f; const int maxi=22; const int maxn=10010; LL d[maxn]; int main() { d[0]=1; for(int i=1;i<maxi;i++) { for(int j=i*i*i;j<maxn;j++) { d[j]+=d[j-i*i*i]; } } int n; while(~scanf("%d",&n)) printf("%lld\n",d ); return 0; }
相关文章推荐
- UVA - 11137 Ingenuous Cubrency——完全背包
- Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
- UVA 11137 Ingenuous Cubrency
- UVA 11137 Ingenuous Cubrency(完全背包)
- uva - 11137 - Ingenuous Cubrency
- UVA 11137 Ingenuous Cubrency
- Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
- UVA - 11137 Ingenuous Cubrency
- UVa 11137 - Ingenuous Cubrency
- 【uva 11137】Ingenuous Cubrency
- UVA 11137 - Ingenuous Cubrency
- 【UVA】11137-Ingenuous Cubrency
- Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
- uva 11137 Ingenuous Cubrency (完全背包)
- UVA 11137 - Ingenuous Cubrency
- UVA - 11137-Ingenuous Cubrency-DP+数学
- Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
- UVA 11137 - Ingenuous Cubrency
- UVA 11137 - Ingenuous Cubrency
- UVa11137 Ingenuous Cubrency