HDU 1398
2014-04-13 21:22
155 查看
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1398
解题方案:利用指数母函数,套模板。
#include <iostream>
#include<cmath>
using namespace std;
const int _max = 100000;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存每一次的情况
int c1[_max], c2[_max];
int table[25];
void mtable()
{
int i;
for(i=1;i<=20;i++)
table[i]=i*i;
}
int main()
{
int i, j, k;
int num;
mtable();
while(cin>>num)
{
if(num==0)
break;
int tmp;
tmp=min(num,17);
for(i=0; i<=num; ++i)
{
c1[i] = 1;
c2[i] = 0;
}
for(i=2; i<=tmp; ++i)
{
for(j=0; j<=num; ++j)
for(k=0; k+j<=num; k+=table[i])
{
c2[j+k] += c1[j];
}
for(j=0; j<=num; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
cout << c1[num] << endl;
}
return 0;
}
解题方案:利用指数母函数,套模板。
#include <iostream>
#include<cmath>
using namespace std;
const int _max = 100000;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存每一次的情况
int c1[_max], c2[_max];
int table[25];
void mtable()
{
int i;
for(i=1;i<=20;i++)
table[i]=i*i;
}
int main()
{
int i, j, k;
int num;
mtable();
while(cin>>num)
{
if(num==0)
break;
int tmp;
tmp=min(num,17);
for(i=0; i<=num; ++i)
{
c1[i] = 1;
c2[i] = 0;
}
for(i=2; i<=tmp; ++i)
{
for(j=0; j<=num; ++j)
for(k=0; k+j<=num; k+=table[i])
{
c2[j+k] += c1[j];
}
for(j=0; j<=num; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
cout << c1[num] << endl;
}
return 0;
}
相关文章推荐
- Opencv之直方图计算calcHist
- Java集合迭代输出
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)
- SurfaceView 连续渲染 SurfaceHolder Canvas
- mysql备份以及恢复
- protobuf
- ubuntu 12.04下安装matlab2012a
- 几种通讯协议的比较RMI > Httpinvoker >= Hessian >> Burlap >> web service
- WTL: CTabView 源码分析
- 每天来点算法_1
- BIOS密码清除方法--unlock6的使用.
- 信监:变更控制
- 二分查找
- WSAAsyncSelect 模型
- hanoi
- 常用SQL语句(增删改查、合并统计、模糊搜索)
- HDU 1085
- 【LeetCode练习题】Combination Sum
- HDU 2108 字符串递归