題目:
description
從起點到終點有n步,如果「走」第k步,將會得到a[k]元錢,a[k]可能為負數。
你也可以花100元錢「跳過」當前的這一步,即不會得到a[k]。但是任何時刻身上的錢都必須是非負的。開始時,你身上共有0元。給定陣列a,求在能到達終點的情況下最小需要走過(即不是用100元錢跳過)的步數。注意:最後一步必須走,不能選擇跳過。
input
共有兩行。
第一行為整數n(0<=n<=100)。
第二行有n個整數,第k個數為a[k],-10000<=a[k]<=10000,。
output
乙個整數,表示需要走的最少步數。若無法走到終點,輸出-1。
sample input
6 30 30 30 30 30 30
sample output
作者思路:乙個記憶化搜尋。
**:
var n,i,m,j:longint;
f:array[0..101,0..101] of longint;
a:array[0..101] of longint;
procedure
dfs(i,mon,sum:longint);
begin
if sum>=m then
exit;
if i=n then
begin
if (mon+a[i]>=0)and(sum+1
then m:=sum+1;
exit;
end;
if sum+1>=m then
exit;
if f[i,sum]>=mon then
exit
else f[i,sum]:=mon;
if f[i,sum]+a[i]>=0
then dfs(i+1,mon+a[i],sum+1);
if f[i,sum]>=100
then dfs(i+1,mon-100,sum);
end;
begin
read(n);
for i:=0
to n do
for j:=0
to n do f[i,j]:=-1;
for i:=1
to n do
read(a[i]);
m:=maxlongint;
dfs(1,0,0);
if m<>maxlongint then
write(m) else
write(-1);
end.
第二題 兩數相加
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...
JZOJ 7 9C組第二題 騎士問題
給出乙個8 8的棋盤,上面有一些障礙物,我們知道騎士是走l形的,現在給出騎士的座標和終點座標,求出騎士能到達的最少步數,如果不能到達就輸出not reachable。就是乙個簡單的bfs模板題,注意細節就好了。include include using namespace std int ans,h...
Leetcode 第二題 兩數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...