uva 10603 倒水問題

2022-08-09 09:18:11 字數 1552 閱讀 7368

劉汝佳說這是一道最短路,可是我怎麼也想不出如何建圖,把問題轉換為最短路問題,我就想自己的辦法。感覺這個題可以用三維dp;每一維代表乙個瓶子            f[maxn][maxn][maxn];狀態轉移我就想:每一次倒水一定要把乙個倒完或把另乙個裝滿才有意義,因為只有這樣三個瓶的水量才知道;所以可以根據這個進行狀態轉移。狀態轉移**有點囉嗦,主要是不同維不能統一乙個式子。最後想到用佇列來存變化的狀態。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

#define maxn 205

8using

namespace

std;910

const

int inf = 0x3f3f3f;11

12int

f[maxn][maxn][maxn];

13int

maxi,maxj,maxk,maxd;

14struct

nodenode;

17int

i,j,k;

18int

ansnum,ans;

19 queueq;

20int

t;21

void

print()

2526

intmain()

2729

//if(freopen("output.txt","w",stdout)== null)

30 cin>>t;

31while(t--)50}

51else58}

59if(k >= (maxi -i))66}

67else74}

75}76if(j !=maxj)84}

85else92}

93if(k >= (maxj -j))

100}

101else

108}

109110

}111

112if(k !=maxk)

120}

121else

128}

129if(j >= (maxk -k))

136}

137else

144}

145}

146}

147 ans = 0;ansnum =inf;

148for(int m = maxd;m>=0;m--)

153if( ansnum > f[m][n][maxk - m -n])

156if(f[maxk - m - n][m][n] 159if(f[n][m][maxk - m - n] 162if(f[n][maxk - m - n][m] 165if(f[maxk - m - n][n][m] 168}

169if(ans) break

;170

}171 printf("

%d %d\n

",ansnum,ans);

172}

173 }

等一會看看別人的解題法,如何用最短路

uva10603 解題報告

uva10603 fill 倒水問題 解題報告 題目大意 設3個杯子的容量為abc,起初只有第三個杯子裝滿了c公升水。其它兩個杯子均為空。最少要倒多少公升水可以讓某乙個杯子裡有d公升水。如果無法做到d公升水。就讓某個杯子裡有d 公升水,其中d 分析 這個樣子其實有一點點動態規劃的味道,其實不是。一看...

Fill BFS 優先佇列 UVA10603

uva 10603 include include include using namespace std struct node friend bool operator node a,node b int a,b,c,d int vis 205 205 b杯和c杯的容量表示一種狀態 int re...

uva 10603 Fill(倒水問題 BFS)

貌似uva崩了,現在進不去,所以這道題還判斷正確與否,其實無所謂了,我這是看的網上的 寫的基本上一樣,唉,沒辦法,不會做,又看了網上的題解,認真寫理解吧還是。構造了乙個結構體,water陣列用來儲存三個杯子的狀態,sum用來儲存當前的倒水量,visit陣列用來儲存狀態,以 防他們重複訪問,三個杯子只...