这是一道经典的枚举优化问题,体现了前缀和预处理思想。
经过总结,枚举的优惠大致有以下几点:
1.通过数学知识,自然判断等人为的缩小某些一定不会发生的范围
2.找出题中的自然联系,如生理周期问题每找到一个周期后迭代周期之积即可
3.前缀和预处理,对于枚举中多次使用的数据提前计算出来,如完美立方问题对立方的预处理
//poj2180完美立方
#include <iostream>
#include<cstdio>
using namespace std;
//这是一道经典的枚举问题,体现了前缀和的预处理思想
int main()
{
int n;
scanf("%d",&n);
int cube[n+1];
//前缀和预处理
for(int i = 1; i <= n; i++)
cube[i] = i*i*i;
for(int i = 6; i <= n; i++){
//通过简单数学知识可以缩小范围
/*1.a最小为6
2.1不会被使用
3.b, c, d的小于a*/
for(int j = 2; j < i; j++)
for(int k = j; k < i; k++)
for(int l = k; l < i; l++)
if(cube[j]+cube[k]+cube[l] == cube[i]){
printf("Cube = %d, Triple = (%d,%d,%d)\n", i, j, k, l);
}
a: ;
}
return 0;
}