对拍从数学的统计学角度来说是一个好的方法,至少能在你竞赛中帮你拿回一些分
--yzr大牛
pas的对拍一开始还没写过,突然想学一下对拍。
那么就学吧。
dp水题(搜索):https://www.luogu.org/problem/show?pid=1164
【题目名称】 小A点菜
【题目背景】
uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。
uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。
【题目描述】
不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000)。
餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种卖ai元(ai<=1000)。由于是很低端的餐馆,所以每种菜只有一份。
小A奉行“不把钱吃光不罢休”,所以他点单一定刚好吧uim身上所有钱花完。他想知道有多少种点菜方法。
由于小A肚子太饿,所以最多只能等待1秒。
【输入输出格式】
输入格式:
第一行是两个数字,表示N和M。
第二行起N个正数ai(可以有相同的数字,每个数字均在1000以内)。
输出格式:
一个正整数,表示点菜方案数。
【输入输出样例】
输入样例#1:
4 4
1 1 2 2
输出样例#1:
3
这是暴力程序dfs:(dfs)
var a:array[1..100000] of longint; u:array[1..100000] of boolean; n,m,i,ans:longint; procedure dfs(k,s:longint); var i:longint; begin if (s>=m)or(k=n) then begin if s=m then inc(ans); exit; end; for i:=k+1 to n do begin if a[i]>m-s then exit; if u[i]=false then begin u[i]:=true; dfs(i,s+a[i]); u[i]:=false; end; end; end; procedure qsort(l,r:longint); var i,j,mid,p:longint; begin i:=l; j:=r; mid:=a[(l+r) div 2]; repeat while a[i]<mid do inc(i); while a[j]>mid do dec(j); if i<=j then begin p:=a[i]; a[i]:=a[j]; a[j]:=p; inc(i); dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; begin assign(input,'in.txt'); assign(output,'out.txt'); reset(input); rewrite(output); readln(n,m); fillchar(u,sizeof(u),false); for i:=1 to n do read(a[i]); qsort(1,n); fillchar(u,sizeof(u),false); dfs(0,0); writeln(ans); close(input); close(output); end.
这是dp程序:(dp)
var j,n,m,i:longint; f,v:array[0..100000]of longint; begin assign(input,'in.txt'); assign(output,'out.txt'); reset(input); rewrite(output); readln(n,m); f[0]:=1; for i:=1 to n do read(v[i]); for i:=1 to n do for j:=m downto v[i] do f[j]:=f[j]+f[j-v[i]]; writeln(f[m]); close(input); close(output); end.
此外我们呢还需要写一个数据生成的程序(maker)
var n,m,i:longint; begin assign(output,'in.txt'); rewrite(output); randomize; n:=random(101); m:=random(10001); writeln(n,' ',m); for i:=1 to n do write(random(1001),' '); writeln; close(output); end.
然后写一个可以重复利用的批处理文件(duipai.bat)
:loop maker.exe dfs.exe dp.exe fc outljc.txt outstd.txt if errorlevel 1 goto end goto loop :end
这是DOS语言,意思差不多是这样的:
loop//循环 maker.exe//运行 数据生成器 dfs.exe//运行 正确程序 dp.exe//运行 待检测程序 fc o1.txt o2.txt//比较 两个程序的输出结果 if errorlevel 1 goto end//如果 有错误(两个输出文件不一样) 就跳到end goto loop//跳到loop :end
然后你就可以继续写下面的题了,不用管他了,
如果等你下一题写好了,还没有退出的话就说明你的程序基本真确:
正在比较文件out.txt 和OUT.TXT
PC:找不到差异