洛谷 P1566 加等式

2021-08-01 15:42:37 字數 1630 閱讀 5149

題目描述

對於乙個整數集合,我們定義「加等式」如下:集合中的某乙個元素可以表示成集合內其他元素之和。如集合中就有乙個加等式: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視為不同的等式...