早教吧作业答案频道 -->其他-->
摆花freepascal动态规划题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为
题目详情
摆花 free pascal 动态规划
题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号。为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
输入
第一行包含两个正整数 n 和 m,中间用一个空格隔开。
第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示 a1、a2、……an。
输出
输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对 1000007 取模的结果。
样例输入
2 4
3 2
样例输出
2
提示
【输入输出样例说明】
有 2 种摆花的方案,分别是(1,1,1,2), (1,1,2,2)。括号里的 1 和 2 表示两种花,
比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。
program p1104;
var n,m,i,j,k,l:integer;
ans:longint;
a:array[1..100] of integer;
f:array[0..100,0..100] of longint;
begin
readln(n,m);
ans:=-maxlongint;
for i:=1 to n do
read(a[i]);
for i:=1 to n do
f[i,0]:=1;
for j:=1 to m do
f[0,j]:=0;
for i:=1 to n do
for j:=1 to m do
begin
if j l:=j
else l:=a[i];
for k:=0 to l do
f[i,j]:=(f[i,j]+f[i-1,j-k]) mod 1000007;
end;
for i:=1 to n do
for j:=1 to m do
if f[i,j]>ans then ans:=f[i,j];
writeln(ans);
end.
各位大侠,哪里错了。。。速度回答
题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号。为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
输入
第一行包含两个正整数 n 和 m,中间用一个空格隔开。
第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示 a1、a2、……an。
输出
输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对 1000007 取模的结果。
样例输入
2 4
3 2
样例输出
2
提示
【输入输出样例说明】
有 2 种摆花的方案,分别是(1,1,1,2), (1,1,2,2)。括号里的 1 和 2 表示两种花,
比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。
program p1104;
var n,m,i,j,k,l:integer;
ans:longint;
a:array[1..100] of integer;
f:array[0..100,0..100] of longint;
begin
readln(n,m);
ans:=-maxlongint;
for i:=1 to n do
read(a[i]);
for i:=1 to n do
f[i,0]:=1;
for j:=1 to m do
f[0,j]:=0;
for i:=1 to n do
for j:=1 to m do
begin
if j l:=j
else l:=a[i];
for k:=0 to l do
f[i,j]:=(f[i,j]+f[i-1,j-k]) mod 1000007;
end;
for i:=1 to n do
for j:=1 to m do
if f[i,j]>ans then ans:=f[i,j];
writeln(ans);
end.
各位大侠,哪里错了。。。速度回答
▼优质解答
答案和解析
我觉得lz的方法有点麻烦。
var
f:array[0..100,0..100]of longint; //f[i,j]表示前i种花摆了j盆的方法数
a:array[0..100]of longint;
n,m,i,j,k:longint;
begin
readln(n,m);
for i:=1 to n do
begin
read(a[i]);
if a[i]>m then a[i]:=m; //如果花的个数多余m,把它当成m来算,多了也没用。
end;
for i:=0 to a[1] do
f[1,i]:=1; //初值。因为同一种花,不论放多少盆都只有一种方法。
for i:=2 to n do
begin
for j:=0 to m do
begin
for k:=a[i] downto 0 do
if(j>=k)then f[i,j]:=(f[i,j]+f[i-1,j-k])mod 1000007; //状态转移方程
end;
end;
writeln(f[n,m] mod 1000007);
end.
var
f:array[0..100,0..100]of longint; //f[i,j]表示前i种花摆了j盆的方法数
a:array[0..100]of longint;
n,m,i,j,k:longint;
begin
readln(n,m);
for i:=1 to n do
begin
read(a[i]);
if a[i]>m then a[i]:=m; //如果花的个数多余m,把它当成m来算,多了也没用。
end;
for i:=0 to a[1] do
f[1,i]:=1; //初值。因为同一种花,不论放多少盆都只有一种方法。
for i:=2 to n do
begin
for j:=0 to m do
begin
for k:=a[i] downto 0 do
if(j>=k)then f[i,j]:=(f[i,j]+f[i-1,j-k])mod 1000007; //状态转移方程
end;
end;
writeln(f[n,m] mod 1000007);
end.
看了摆花freepascal动态规...的网友还看了以下:
利用艾森斯坦判断法,证明:若是P1、P2、…Pt是t个不相同的素数,那么P1P2….Pt^1∕n是一 2020-03-30 …
我在外国留学,中文不是很好,我在书上找到些数学题目,想请教你们怎么找出答案.我可能翻译的很差,请多 2020-05-21 …
计算极限的问题lim1/n+1/n+1/n+1/n+……+1/n每一项都有极限,所以拆分算,为零, 2020-05-24 …
已知有序数列A[1..n]和一个正整数x,设计一个复杂度为O(n)的算法,判断A中是否有两个元素它 2020-07-10 …
ΣΣPij是怎么个加法?第一个Σ是i=1~n,第二个Σ是j=1~m.是说把n•m个数都加上?还是以 2020-07-21 …
设计算法求接a^nmodm,其中a>1,n是一个大整数.如何处理a^n的巨大数量级? 2020-07-23 …
请教一道高数证明题?设f(x)在[0,1]上连续,f(0)=f(1).证明:对自然数n>=2,必有 2020-08-01 …
新概念2上的问题新版新概念二教材中的如生词和短语中的friendly(1.2)adj.友好的、pos 2020-11-22 …
已知有序数列A[1..n]和一个正整数x,设计一个复杂度为O(n)的算法,判断A中是否有两个元素它们 2020-12-09 …
平面直角坐标系内,点A(n,1-n)一定不在. 2020-12-25 …