Description
佳餚就是非常美味的菜的意思,佳餚最關鍵的是選擇好原料。
現在有N種原料,每種原料都有酸度S和苦度B兩個屬性,當選擇多種原料時,總酸度爲每種原料的酸度之積,總苦度爲每種原料的苦度之和。
正如大家所知,佳餚是既不酸也不苦的,因爲要保證所選的原料使得總酸度和總苦度差的絕對值最小。
由於佳餚不能只有水,所以必須至少選擇一種佳餚。
Input
輸入第一行包含一個整數N(1<=N<=10),表示原料的種數。
接下來N行每行包含兩個用一個空格隔開的整數,分別表示酸度和苦度。
輸入數據保證如果所有原料都選上,總酸度和總苦度不會超過10^9。
Output
輸出總酸度和總苦度最小的差。
Sample Input
輸入1:
1
3 10
輸入2:
2
3 8
5 8
輸入3:
4
1 7
2 6
3 8
4 9
Sample Output
輸出1:
7
輸出2:
1
輸出3:
1
Data Constraint
Hint
【樣例解釋】
樣例3中選擇最後三種原料,這樣總酸度爲2×3×4=24,總苦度爲6+8+9=23,差爲1。
正解
因爲N<=10,所以可以枚舉所有的情況,對總酸度和總苦度的差的絕對值取min就可以啦。(這種良心數據要珍惜啊)
可以用一個類似狀壓/dfs做
CODE
dfs版
var
n,i,j,ans:longint;
a,b:array[1..10] of longint;
procedure dfs(pick,dep,x1,x2:longint);
begin
if dep=n then
begin
if (abs(x1-x2)<ans) and (pick>0) then ans:=abs(x1-x2);
exit;
end;
dfs(pick,dep+1,x1,x2);
dfs(pick+1,dep+1,x1*a[dep+1],x2+b[dep+1]);
end;
begin
readln(n);
for i:=1 to n do
readln(a[i],b[i]);
ans:=maxlongint;
dfs(0,0,1,0);
writeln(ans);
end.
類似狀壓版
uses math;
var
tot,n,i,j,s:longint;
sums,sumk,ans:int64;
x,y,b:array[0..20]of longint;
pow:array[0..20]of int64;
begin
readln(n);
pow[0]:=1;
for i:=1 to n do begin
readln(x[i],y[i]);
pow[i]:=pow[i-1]*2;
end;
ans:=maxlongint;
for i:=1 to pow[n]-1 do begin
j:=i;
tot:=0;
sums:=1;sumk:=0;
while j<>0 do begin
s:=j mod 2;
inc(tot);
b[tot]:=s;
j:=j div 2;
end;
for j:=1 to tot do begin
if b[j]=1 then begin
sums:=sums*x[j];
sumk:=sumk+y[j];
end;
end;
ans:=min(ans,abs(sums-sumk));
end;
writeln(ans);
end.