求pascal 数字排列组合代码
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/19 03:12:23
求pascal 数字排列组合代码
例
数组a
4 5 3 1
怎么求出每种组合的解`如4+5=9 4+5+3=12 5+3=8等等``
有没有类似DP的算法``就是几个for~``简单的算法```
不要复制一堆东西给我````谢谢合作!
发个代码过来``不管是什么算法```谢谢~
例
数组a
4 5 3 1
怎么求出每种组合的解`如4+5=9 4+5+3=12 5+3=8等等``
有没有类似DP的算法``就是几个for~``简单的算法```
不要复制一堆东西给我````谢谢合作!
发个代码过来``不管是什么算法```谢谢~
这个不能用DP,因为你要每种组合的解.DP只有在你规定使用多少个数,求最大或最小时才管用.(要满足:1最优,2无后效性 才用DP)
而这样的题目显然就是穷举,当然优化一点就是用DFS.
如果用BFS也可以,那就要多开一个数组记录使用了哪些数字了.
const max=10;{数组的范围,根据需要自己扩大}
var
a:array [1..max] of integer;{记录每个数}
use:array [1..max] of boolean;{记录每个数可不可以使用}
n,i:integer;{n:数的总个数,i:循环变量}
procedure dfs(now:integer;ans:string;sum:integer);
{now:循环的起点,可以排除重复;ans:记录式子;sum:记录前面式子的和}
var i:integer;{循环变量}
s:string;{把数转成字符串}
begin
if sum>0 then writeln(ans,'=',sum);
for i:=now to n do if use[i] then begin
use[i]:=false;
str(a[i],s);
if sum>0 then dfs(now+1,ans+'+'+s,sum+a[i])
else dfs(now+1,s,sum+a[i]);
{这两个其实是同一个意思,只是式子的第一个数前不需要加号,所以单独处理}
use[i]:=true;
end;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do use[i]:=true;
dfs(1,'',0);
end.
已经排除了 4+5=9 和 5+4=9 的重复问题了.
而这样的题目显然就是穷举,当然优化一点就是用DFS.
如果用BFS也可以,那就要多开一个数组记录使用了哪些数字了.
const max=10;{数组的范围,根据需要自己扩大}
var
a:array [1..max] of integer;{记录每个数}
use:array [1..max] of boolean;{记录每个数可不可以使用}
n,i:integer;{n:数的总个数,i:循环变量}
procedure dfs(now:integer;ans:string;sum:integer);
{now:循环的起点,可以排除重复;ans:记录式子;sum:记录前面式子的和}
var i:integer;{循环变量}
s:string;{把数转成字符串}
begin
if sum>0 then writeln(ans,'=',sum);
for i:=now to n do if use[i] then begin
use[i]:=false;
str(a[i],s);
if sum>0 then dfs(now+1,ans+'+'+s,sum+a[i])
else dfs(now+1,s,sum+a[i]);
{这两个其实是同一个意思,只是式子的第一个数前不需要加号,所以单独处理}
use[i]:=true;
end;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do use[i]:=true;
dfs(1,'',0);
end.
已经排除了 4+5=9 和 5+4=9 的重复问题了.