【穷竭】POJ3187-Backward Digit Sums
【思路】
利用杨辉三角形,每一个数字被加的次数等于它在杨辉三角形中对应的那个数字。注意这道题的意思是,最底层是N的全排序,而不是指1..10都可以。生成杨辉三角形的时候第一次我用了二重循环模拟生成,后来学习到,杨辉三角形中,第n行第k个数字为Cnk。不过在第二个程序中我的杨辉三角形没有预处理,导致了很多时间的浪费。用了深搜和STL两种方法。深搜因为能够剪枝所以明显要比Next_permuation快。
/*232K 0MS*/
/*模拟+深搜*/
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=+;
int n,sum;
int a[MAXN][MAXN];
int ans[MAXN];
int vis[MAXN];
int f; void gettri()
{
for (int i=;i<n;i++)
{
a[i][]=;
a[i][i]=;
}
for (int i=;i<n;i++)
for (int j=;j<i;j++)
a[i][j]=a[i-][j-]+a[i-][j];
} void print()
{
for (int i=;i<n;i++) cout<<ans[i]<<' ';
cout<<endl;
} void getnum(int step,int nowsum)
{
if (step==n)
{
if (nowsum==sum)
{
f=;
printf();
}
return;
}
if (f||nowsum>sum) return;
for (int i=;i<=n;i++)
{
if (vis[i]==) continue;
vis[i]=;
ans[step]=i;
getnum(step+,nowsum+i*a[n-][step]);
vis[i]=;
}
} int main()
{
scanf("%d%d",&n,&sum);
gettri(); memset(vis,,sizeof(vis));
f=;
getnum(,);
return ;
}
/*232K 469MS*/
/*组合+STL*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=+;
int n,sum;
int ans[MAXN]; int c(int n,int k)
{
int cresult=;
for (int i=;i<k;i++) cresult=cresult*(n-i)/(i+);
//这里不能写成cresult=cresult*(n-i)/(k-i),因为如果从大到小可能无法整除,精确度会导致错误
return cresult;
} int main()
{
scanf("%d%d",&n,&sum);
for (int i=;i<n;i++) ans[i]=i+;
do
{
int result=;
for (int i=;i<n;i++) result+=ans[i]*c(n-,i);
if (result==sum)
{
for (int i=;i<n;i++) cout<<ans[i]<<' ';
cout<<endl;
break;
}
}while (next_permutation(ans,ans+n));
return ;
}
【穷竭】POJ3187-Backward Digit Sums的更多相关文章
- POJ3187 Backward Digit Sums 【暴搜】
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4487 Accepted: 25 ...
- (DFS、全排列)POJ-3187 Backward Digit Sums
题目地址 简要题意: 输入两个数n和m,分别表示给你1--n这些整数,将他们按一定顺序摆成一行,按照杨辉三角的计算方式进行求和,求使他们求到最后时结果等于m的排列中字典序最小的一种. 思路分析: 不难 ...
- POJ-3187 Backward Digit Sums (暴力枚举)
http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...
- POJ3187 Backward Digit Sums
给出杨辉三角的顶点值,求底边各个数的值.直接DFS就好了 #include<iostream> #include<cstdio> #include<cstring> ...
- 【POJ - 3187】Backward Digit Sums(搜索)
-->Backward Digit Sums 直接写中文了 Descriptions: FJ 和 他的奶牛们在玩一个心理游戏.他们以某种方式写下1至N的数字(1<=N<=10). 然 ...
- BZOJ1653: [Usaco2006 Feb]Backward Digit Sums
1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 207 Solved: ...
- Backward Digit Sums(POJ 3187)
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5495 Accepted: 31 ...
- Backward Digit Sums(暴力)
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5664 Accepted: 32 ...
- 1653: [Usaco2006 Feb]Backward Digit Sums
1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 285 Solved: ...
随机推荐
- Sketch VS Photoshop
参考:http://mp.weixin.qq.com/s?__biz=MjM5NTQ5MjIyMA==&mid=217309554&idx=4&sn=4d6a5239ca813 ...
- cookie、session、localstorage
最早的Cookies问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还蛮好.cookie的内容主要包括:名字,值,过期时间, ...
- python基础===字符串切片
字符串的子串可以通过切片标志来表示:两个由冒号隔开的索引. >>> word 'HelpA' >>> word[4] 'A' >>> word[0 ...
- 关于 拼接 url 连接 参数的问题(爬虫)。
比如这里 我找的 后台请求的json的链接: 第一页: http://www.igoldenbeta.com:8080/cn-jsfund-server-mobile/bkt/api?appkey=1 ...
- 5:django 常用函数
用django写view函数的时候,我们常常用到django.shortcuts里面的很多常用函数, 这节我们来看看这些函数的具体用法吧 render render(request, template ...
- 外部div不能包裹内部div的问题
转自http://www.du52.com/text.php?id=362 当设计网页时,如果内部div全部设置css属性float为左右浮动,那么外部div将不能包裹内部div 解决方法 1.在内部 ...
- sharding-JDBC 实现读写分离
需求 一主两从,做读写分离. 多个从库之间实现负载均衡. 可手动强制部分读请求到主库上.(因为主从同步有延迟,对实时性要求高的系统,可以将部分读请求也走主库) 本次不讨论 MySQL如何配置主从同步相 ...
- redis之(六)redis的列表类型的命令
[一]向列表两端添加元素 -->命令:LPUSH key value [value ...] -->向列表的左侧添加元素,返回值表示增加元素后列表的长度 -->命令:RPUSH ke ...
- 兼容python3的SSDB客户端
SSDB.py import socket class SSDB_Response(object): def __init__(self, code='', data_or_message=None) ...
- System.Web.HttpContext.Current.Request用法
public static void SetRegisterSource() { if (System.Web.HttpContext.Current.Request["website&qu ...