链接

分析:我们用vis[i][j][k]来记录A,B,C三个状态是否被访问过,同时用s[i]来记录C的所有可能值,当i==0时,如果j合法,则标记s[k]=1,最后统计所有为1的s即可

 /*
PROB:milk3
ID:wanghan
LANG:C++
*/
#include "iostream"
#include "cstdio"
#include "cstring"
#include "string"
#include "vector"
using namespace std;
const int maxn=;
int vis[maxn][maxn][maxn];
int s[maxn];
int A,B,C;
void dfs(int i,int j,int k){
if(vis[i][j][k]) return;
if(i>A||j>B||k>C) return;
if(i==){
s[k]=;
}
vis[i][j][k]=;
if(k>=A-i) //C->A
dfs(A,j,k-(A-i));
else
dfs(i+k,j,);
if(k>=B-j) //C->B
dfs(i,B,k-(B-j));
else
dfs(i,j+k,);
if(i>=C-k) //A->C
dfs(i-(C-k),j,C);
else
dfs(,j,k+i);
if(j>=C-k) //B->C
dfs(i,j-(C-k),C);
else
dfs(i,,j+k);
if(i>=B-j) //A->B
dfs(i-(B-j),B,k);
else
dfs(,i+j,k);
if(j>=A-i) //B->A
dfs(A,j-(A-i),k);
else
dfs(i+j,,k);
}
int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
cin>>A>>B>>C;
memset(vis,,sizeof(vis));
memset(s,,sizeof(s));
dfs(,,C);
vector<int> h;
for(int i=;i<=C;i++)
if(s[i])
h.push_back(i);
for(int i=;i<h.size();i++){
if(i==h.size()-)
cout<<h[i]<<endl;
else
cout<<h[i]<<" ";
}
return ;
}

最新文章

  1. 安全测试 - 抓包工具BurpSuite
  2. 修改项目生成Gemfile的模板
  3. C# Like参数化 小记
  4. js 实现angylar.js view层和model层双绑定(改变view刷新 model,改变model自动刷新view)
  5. sql深入理解
  6. sh.exe&quot;: grunt: command not found
  7. android studio简易了解第二部分
  8. C语言中的%0nd,%nd,%-nd
  9. &lt;a&gt;标签的href属性
  10. webpack的配置及使用
  11. Tree(未解决。。。)
  12. 做自己的PHP语法解释器
  13. 汽车Vin码识别——可以嵌入到手机里的新OCR识别技术
  14. border-image的拉伸和平铺
  15. CSS3@media媒体查询
  16. 牛客小白月赛13 小A的最短路(lca+RMQ)
  17. CSAPP:第三章程序的机器级表示2
  18. div “下沉”
  19. 【python基础】迭代器和生成器函数
  20. python随笔 join 字典,列表的清空 set集合 以及深浅拷贝(重点..难点)

热门文章

  1. ros使用罗技f710无线控制手柄
  2. configure: error: Cannot find php_pdo_driver.h.
  3. [转] sql 删除表数据的drop、truncate和delete用法
  4. 【postman】安装使用说明
  5. 聊聊Code Review
  6. 【Todo】Java8新特性学习
  7. lua 异常 错误处理 pcall
  8. Printing multipage output
  9. 【转载】WebService相关概念
  10. AIX下RAC搭建 Oracle10G(二)主机配置