新年趣事之打牌
【問題描述】
過年的時候,大人們最喜歡的活動,就是打牌了。xiaomengxian不會打牌,只好坐在一邊看著。
這天,正當一群人打牌打得起勁的時候,突然有人喊道:「這副牌少了幾張!」眾人一數,果然是少了。於是這副牌的主人得意地說:「這是一幅特製的牌,我知道整副牌每一張的重量。只要我們稱一下剩下的牌的總重量,就能知道少了哪些牌了。」大家都覺得這個辦法不錯,於是稱出剩下的牌的總重量,開始計算少了哪些牌。由於資料量比較大,過了不久,大家都算得頭暈了。
這時,xiaomengxian大聲說:「你們看我的吧!」於是他拿出膝上型電腦,編出了乙個程式,很快就把缺少的牌找了出來。
如果是你遇到了這樣的情況呢?你能辦到同樣的事情嗎?
【輸入檔案】
第一行乙個整數totalw,表示剩下的牌的總重量。
第二行乙個整數n(1
【輸出檔案】
如果無解,則輸出「0」;如果有多解,則輸出「-1」;否則,按照公升序輸出丟失的牌的編號,相鄰兩個數之間用乙個空格隔開。
【輸入樣例】
2704
100110
170200
【輸出樣例】
2 4********************==
*************************=
var totalw:longint;
n:longint;
w:array[1..1000]of longint;
f:array[0..100000]of longint;
g,g1:array[0..100000]of longint;
ans:array[1..1000]of boolean;
procedure init;
begin
assign(input,'bag.in');
assign(output,'bag.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure print(t:longint);
begin
if g[t]<>0 then print(g[t]);
ans[g1[t]]:=false;
end;
procedure main;
var i,j:longint;
begin
readln(totalw);
readln(n);
for i:=1 to n do read(w[i]);
fillchar(g,sizeof(g),$ff);
fillchar(f,sizeof(f),0);
f[0]:=1;
for i:=1 to n do
for j:=totalw downto w[i] do
if f[j-w[i]]<>0 then
begin
f[j]:=f[j]+f[j-w[i]];
if f[j]=1 then
begin
g1[j]:=i;
g[j]:=j-w[i];
end;
end;
if f[totalw]=0 then
begin
writeln(0);
terminate;
endelse
begin
if f[totalw]>1 then
begin
writeln(-1);
endelse
begin
fillchar(ans,sizeof(ans),true);
print(totalw);
for i:=1 to n do
if ans[i] then write(i,' ');
endend;
end;
begin
init;
main;
terminate;
end.
新年趣事之打牌
問題描述 過年的時候,大人們最喜歡的活動,就是打牌了。xiaomengxian不會打牌,只好坐在一邊看著。這天,正當一群人打牌打得起勁的時候,突然有人喊道 這副牌少了幾張!眾人一數,果然是少了。於是這副牌的主人得意地說 這是一幅特製的牌,我知道整副牌每一張的重量。只要我們稱一下剩下的牌的總重量,就能...
新年趣事之打牌 DP
新年趣事之打牌 輸入檔案 bagb.in 輸出檔案 bagb.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 題目描述 過年的時候,大人們最喜歡的活動,就是打牌了。xiaomengxian不會打牌,只好坐在一邊看著。這天,正當一群人打牌打得起勁的時候,突然有人喊道 這副牌少了幾張!眾人...
動態規劃 新年趣事之打牌
問題 問題描述 過年的時候,大人們最喜歡的活動,就是打牌了。xiaomengxian不會打牌,只好坐在一邊看著。這天,正當一群人打牌打得起勁的時候,突然有人喊道 這副牌少了幾張!眾人一數,果然是少了。於是這副牌的主人得意地說 這是一幅特製的牌,我知道整副牌每一張的重量。只要我們稱一下剩下的牌的總重量...