沙漠之旅(二维dp)
生活随笔
收集整理的這篇文章主要介紹了
沙漠之旅(二维dp)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
“小胖要穿越一片沙漠,小胖開著一輛大吉普,小胖的吉普油耗高,吉普能放四桶油。”
這就是人人會唱的沙漠之歌~~體現(xiàn)了小胖拔群的聰明才智。
小胖的問題是這樣的:現(xiàn)在需要駕車穿越一片沙漠,總的行駛路程為L。小胖的吉普裝滿油能行駛X距離,同時其后備箱最多能放下四桶油。在起點有N種汽油,每種汽油都有無限桶,一桶能行駛距離Ai。現(xiàn)在小胖想知道:能不能恰好帶四桶油,再加上出發(fā)前裝滿的油,使得恰好能行駛L距離。
Input
第一行一個正整數(shù)T(1 <= T <= 50),表示數(shù)據(jù)的組數(shù)。
接下來T組數(shù)據(jù),每組數(shù)據(jù)的第一行是三個整數(shù)L(1 <= L <= 1000),X(1 <= X <= L),N(1 <= N <= 1000)。
接下來N行,每行一個正整數(shù)Ai(1 <= Ai <= 1000),表示第i種汽油一桶能行駛的距離。
Output
對于每組數(shù)據(jù)輸出一行,若能輸出“Yes”,否則輸出“No”
Sample Input
1 20 9 2 2 3Sample Output
YesAC代碼:
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f int dp[1010][5]; int T,L,X,N,a[1010]; int main() {int i,j,k,t;while(cin>>T)while(T--){cin>>L>>X>>N;L-=X;for(i=0;i<N;i++)cin>>a[i];memset(dp,-INF,sizeof(dp));dp[0][0]=0;for(i=0;i<N;i++){for(j=a[i];j<=L;j++){for(k=1;k<5;k++){for(t=1;t<=k&&t*a[i]<=j;t++)dp[j][k]=max(dp[j][k],dp[j-a[i]*t][k-t]+t*a[i]);}}}if(dp[L][4]==L)cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的沙漠之旅(二维dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 湫湫系列故事——消灭兔子(优先队列)
- 下一篇: Spring Boot开发之流水无情(二