劉汝佳說這是一道最短路,可是我怎麼也想不出如何建圖,把問題轉換為最短路問題,我就想自己的辦法。感覺這個題可以用三維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陣列用來儲存狀態,以 防他們重複訪問,三個杯子只...