http://acm.hdu.edu.cn/showproblem.php?pid=3022

题意:

最多不超过10000组数据,每组数据给定两个数n,m,求一个最小的数,使得该数每一位之和等于n,每一位的平方和等于m。
若无解或者答案超过100位,输出no solution。
 
n最大=900,m最大=8100
dp[i][j]表示和为i,平方和为j的最少位数
dp2[i][j]表示和为i,平方和为j的最小首位数
竟然一直在思考有前导0怎么办,最优解肯定不能出现0啊啊啊
 
#include<cstdio>
#include<algorithm> using namespace std; #define N 901
#define M 8101 int dp[N][M],dp2[N][M]; void pre()
{
for(int i=;i<=;++i) dp[i][i*i]=,dp2[i][i*i]=i;
for(int i=;i<N;++i)
for(int j=;j<M;++j)
if(dp[i][j] && dp[i][j]!=)
for(int k=;k<=;++k)
if(!dp[i+k][j+k*k] || dp[i+k][j+k*k]>dp[i][j]+)
{
dp[i+k][j+k*k]=dp[i][j]+;
dp2[i+k][j+k*k]=k;
}
else if(dp[i+k][j+k*k]==dp[i][j]+) dp2[i+k][j+k*k]=min(dp2[i+k][j+k*k],k);
} int main()
{
pre();
int T,n,m,d;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
if(n>=N || m>=M || !dp[n][m]) printf("No solution\n");
else
{
while(n)
{
printf("%d",d=dp2[n][m]);
n-=d;
m-=d*d;
}
putchar('\n');
}
}
return ;
}

最新文章

  1. PHP中关于PDO的使用
  2. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q131-Q134)
  3. Java实现中文数字转换为阿拉伯数字
  4. Visual Studio Code初探
  5. 利用exif.js解决ios手机上传竖拍照片旋转90度问题
  6. Shell数组的增删改查
  7. Android 签名(2)签名知识要点
  8. linux安装时提示发生不正常错误问题
  9. oracle 存储过程和函数例子 --2
  10. java删除文件夹下所有文件
  11. Lua多重继承
  12. KEIL中逻辑分析仪的使用
  13. The C++ Programming Language 学习笔记 第7章 函数
  14. PAT 1083 是否存在相等的差
  15. 不跳转修改url(history.pushState)
  16. js实现页面重定向
  17. XML 解析的两种方法
  18. 我在linux中使用的vundle 和 vimrc配置
  19. 【gulp】imageisux安装(webp图片)
  20. 如何保护自己的GitHub代码不被别人覆盖

热门文章

  1. 基于.NET Standard的分布式自增ID算法--Snowflake代码实现
  2. Scrapyd+Gerapy部署Scrapy爬虫进行可视化管理
  3. LintCode——交叉字符串
  4. Hadoop版本的选择问题
  5. 【GAN与NLP】GAN的原理 —— 与VAE对比及JS散度出发
  6. pycharm 调试 scrapy
  7. 20135119_涂文斌 实验三 敏捷开发与XP实践
  8. 第二阶段冲刺——six
  9. 每日scrum(6)
  10. Android Handler 异步调用修改界面与主线程