題目描述
對於乙個整數集合,我們定義「加等式」如下:集合中的某乙個元素可以表示成集合內其他元素之和。如集合中就有乙個加等式:3=1+2,而且3=1+2 和3=2+1是相同的加等式,也是這個集合唯一的加等式。給定乙個整數集合,程式設計找出其所有的加等式的個數
輸入輸出格式
輸入格式:
第一行為t,表示測試資料組數。(1≤t≤10);
接下來t 行,每行表示一組測試資料。其中第乙個數m(1≤m≤30),表示集合元素的個數,接下來m 個不同的整數x 分別表示集合元素(1≤m≤1000)。
輸出格式:
對於每個輸入資料,輸出乙個整數,表示其中加等式的個數。
輸入輸出樣例
輸入樣例#1:
3 3 1 2 3
3 1 2 5
6 1 2 3 5 4 6
輸出樣例#1:
1 0
7刷t遍揹包就好了
var t,n,maxm,i,ans:longint;
x:array[0..35]of longint;
opt:array[0..1005]of longint;
vis:array[0..1005]of boolean;
function
max(x,y:longint):longint;
begin
if x>y then
exit(x) else
exit(y);
end;
procedure
init;
var i:longint;
begin
read(n);
for i:=1
to n do
begin
read(x[i]);
maxm:=max(maxm,x[i]);
end;
readln;
end;
procedure
main;
var i,j:longint;
begin
fillchar(opt,sizeof(opt),0);
fillchar(vis,sizeof(vis),0);
vis[0]:=true;ans:=0;opt[0]:=1;
for i:=1
to n do
for j:=maxm downto0do
if (vis[j]=true)and(j+x[i]<=maxm) then
begin
vis[j+x[i]]:=true;
opt[j+x[i]]:=opt[j+x[i]]+opt[j];
end;
for i:=1
to n do
ans:=ans+opt[x[i]]-1;
end;
procedure
print;
begin
writeln(ans);
end;
begin
readln(t);
for i:=1
to t do
begin
init;
main;
print;
end;
end.
洛谷 P1149 火柴棒等式
題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果a b,則a b c與b a c視為不同的等式 a b c 0 n根火柴棍必須全部用上...
洛谷P1149 火柴棒等式
題目 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b ca b c 的等式?等式中的aa bb cc是用火柴棍拼出的整數 若該數非零,則最高位不能是00 用火柴棍拼數字0 90 9的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果a b,則a b c與b a c視為不同的等式 a,b,...
洛谷P1149 火柴棒等式
給你n根火柴棍,你可以拼出多少個形如 a b ca b c 的等式?等式中的aa bb cc是用火柴棍拼出的整數 若該數非零,則最高位不能是00 用火柴棍拼數字0 90 9的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果a ba b,則a b ca b c與b a cb a c視為不同的等式...