完美平方wzoi-741

该篇文章介绍了一个编程问题,要求找到一系列正整数最少可以表示为多少个完全平方数之和,通过动态规划方法解决,涉及完全背包模型。样例输入和输出展示了如何处理数据并计算结果。
摘要由CSDN通过智能技术生成

完美平方

提交数: 561, 通过率: 17.11%, 平均分: 49.62

题目描述:

      任何一个数都可以被表示为若干个完全平方数(完全平方数指根号后为整数的数,例如9,25,36,100等)之和,例如:12可以表示为4+4+4,13可以表示为9+4。现在一共有n个数 �1,�2,�3,…��−1,�� 。请你求出每个数最少可以分解为多少个完全平方数之和。

输入格式:

      第一行一个正整数�,意义同题目。

      随后�行,每行一个正整数,第 �+1行的数表示题目中的 �� 。

输出格式:

      共�行,第�行表示��的最少完全平方数之和的个数。

样例输入:
3
12
13
39
样例输出:
3
2
4
提示:

样例解释:

12=4+4+4;

13=4+9;

39=25+9+4+1;(有多种方式)

对于10%的数据,n<=20;

对于30%的数据,n<=100;

对于55%的数据,n<=200,所有的ai都保证:0<ai<=20000;

对于100%的数据,n<=50000,所有的ai都保证:0<ai<=400000;

本题是给对于做不出超难动规想刷水题或者初学动规的的奆佬们刷题用的。

时间限制: 2000ms
空间限制: 256MB


#include <bits/stdc++.h>
using namespace std;
int n, a[50001], f[400001], maxn;

int main(){
	cin >> n;
	for ( int i=1; i<=n; ++i){
		cin >> a[i];
		maxn =  a[i] > maxn ? a[i] : maxn;  //取出现过的最大数
	}
	memset( f, 0x3f, sizeof f );  //注意这里要初始化为无穷大
	//===============================
	f[0]=0;
	for ( int i=1; i * i <= maxn ; i++ ) { 
		for ( int j = i*i ; j<=maxn ; j++)  //完全背包模型
			f[j] = min(f[j],f[j-i*i]+1);
	}
	//================================
	for ( int i=1; i<=n; i++) cout << f[ a[i] ]<<'\n';
    return 0;
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值