博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10581 - Partitioning for fun and profit(数论递推)
阅读量:5216 次
发布时间:2019-06-14

本文共 1158 字,大约阅读时间需要 3 分钟。

10581 - Partitioning for fun and profit

题意:给定m, n,表示分配给n个格子,分配m个数字进去,每一个格子最少1,而且序列要是递增的,问第k个字典序的序列是什么

思路:先利用dp打出表,dp[i][j][k]表示第i个数,尾巴为j,总和剩下k的情况,写一个记忆化求出,之后在这个数组基础上,从左往右枚举要放那个数字合适,合适的就放进去而且输出,注意最后一个数字要单独输出。

代码:

#include 
#include
typedef long long LL;int t, M, n, vis[15][225][225];LL k, dp[15][225][225];LL DP(int now, int tail, int m) { LL &ans = dp[now][tail][m]; if (vis[now][tail][m]) return ans; vis[now][tail][m] = 1; ans = 0; if (now == n) return ans = 1; if (now == n - 1) { if (m >= tail) return ans = DP(now + 1, m, 0); return ans = 0; } for (int i = tail; i <= m - (n - now - 1); i++) ans += DP(now + 1, i, m - i); return ans;}void solve(LL k) { int v = 1; for (int i = 1; i < n; i++) { for (int j = v; j <= M - (n - i); j++) { if (k > dp[i][j][M - j]) k -= dp[i][j][M - j]; else { M -= j; v = j; printf("%d\n", j); break; } } } printf("%d\n", M);}int main() { scanf("%d", &t); while (t--) { memset(vis, 0, sizeof(vis)); scanf("%d%d%lld", &M, &n, &k); DP(0, 1, M); solve(k); } return 0;}

转载于:https://www.cnblogs.com/hrhguanli/p/3927501.html

你可能感兴趣的文章
android permission
查看>>
javascript获取textarea中所选文本的开始位置、结束位置和选择的文本
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
C#修饰符
查看>>
20.核心初始化之异常向量表
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
js 封装获取元素的第一个元素
查看>>
iOS 获取Home键指纹验证
查看>>
Python-Mac 安装 PyQt4
查看>>
P2571 [SCOI2010]传送带
查看>>
哈希表1
查看>>
用Data Url (data:image/jpg;base64,)将小图片生成数据流形式
查看>>
实验2-2
查看>>
C#初识
查看>>