正经题解|小码君喝牛奶
2024-03-22 13:35:41
发布于:浙江
45阅读
0回复
0点赞
【题目标题】小码君喝牛奶
【算法分析】
因为牛奶的总量是不变的,所以可以用 中的牛奶量做状态,初始状态是 ,每次只能有6种选择,倒,倒,倒,倒,倒,倒。用一个数组判重,记录中所有可能值(表示 中可能出现 ,如果当前状态是,那么,最后输出中所有的z就可以了。 用也行,也就是说三维的也行。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
int A,B,C;
int tot;
int vis[25][25]; //vis[a][b] 表示分别有a,b升的状态
int res[25]; //res[i]表示是否会还剩i升水
void dfs(int a,int b){
int c = tot - a - b;
if(vis[a][b])
return;
else
vis[a][b] = 1;
if((!a) && (!res[c])) //a已经空,统计答案
res[c] = 1;
if(c >= (A - a)) //可以从c倒满a
dfs(A,b);
else
dfs(c + a,b);
if(c >= (B - b)) //可以从c倒满b....下同
dfs(a,B);
else
dfs(a,c + b);
if(b >= (A - a))
dfs(A,b - (A - a));
else
dfs(b + a,0);
if(b >= (C - c))
dfs(a,b - (C -c));
else
dfs(a,0);
if(a >= (C - c))
dfs(a - (C - c),b);
else
dfs(0,b);
if(a >= (B - b))
dfs(a - (B - b),B);
else
dfs(0,a + b);
}
int main(){
cin >> A >> B >> C;
tot = C;
dfs(0,0);
for(int i = 0;i <= 21;i++){
if(res[i]) cout << i << ' ';
}
}
【时间复杂度】
【预期得分】
100pts
这里空空如也
有帮助,赞一个