UVA - 10604 Chemical Reaction
2013-09-29 16:07
447 查看
有m种化学药品(m<=6),不同的药品和不同的药品混合将生成不同的药品并释放一定的热量(可能为负)。现在有k个装有化学药品的试管(2<=k<=10),要将他们混合成一种药品,我们知道混合的顺序不同则释放的总热量也不同,求最小总热量。六维记录当6种药品还有x1,x2,x3,x4,x5,x6时的最小热量
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 1<<30; int m,k,t[12],r[10][10],w[10][10],map[10][10][10][10][10][10]; int vis[10][10][10][10][10][10]; int dp(int x[]){ int &ans = map[x[1]][x[2]][x[3]][x[4]][x[5]][x[6]]; if (vis[x[1]][x[2]][x[3]][x[4]][x[5]][x[6]]) return ans; vis[x[1]][x[2]][x[3]][x[4]][x[5]][x[6]] = 1; if (x[1]+x[2]+x[3]+x[4]+x[5]+x[6]<=1) return ans = 0; ans = INF; int y[] = {x[0],x[1],x[2],x[3],x[4],x[5],x[6]}; for (int i = 1; i <= m; i++) if (y[i]){ --y[i]; for (int j = 1; j <= m; j++) if (y[j]){ --y[j]; ++y[r[i][j]]; if (dp(y) < INF) ans = min(ans,w[i][j]+dp(y)); ++y[j],--y[r[i][j]]; } ++y[i]; } return ans; } int main(){ int cas; scanf("%d",&cas); while (cas--){ memset(vis,0,sizeof(vis)); scanf("%d",&m); for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) scanf("%d%d",&r[i][j],&w[i][j]); scanf("%d",&k); for (int i = 1; i <= k; i++) scanf("%d",&t[i]); scanf("%*s"); int x[12] = {0}; for (int i = 1; i <= k; i++) ++x[t[i]]; printf("%d\n",dp(x)); } return 0; }
相关文章推荐
- 几款代码混淆器(DotFuscator, .NET Reactor, xenocode)
- I/O事件处理模型之Reactor和Proactor 【转】
- 9、multiple reactors + thread pool(one loop per thread + threadpool)(突发I/O与密集计算)
- 8、multiple reactors(能适应更大的突发I/O) 多个事件循环
- 7、reactor + thread pool(能适应密集计算)
- 6、reactor + worker thread(过渡方案) 事件循环+一个连接一个线程
- 5、reactor (事件循环)+ thread per request(过渡方案) 每当一个请求过来就创建一个线程出来
- 4、反应式( reactive )服务器 (reactor模式) 单线程轮询多个客户端
- ReactiveCocoa
- ReactiveCocoa 迎接下一个更加美好的世界
- 高性能IO设计的Reactor和Proactor模式
- .net Reactor加密,注册C#软件
- ACE反应器(Reactor)模式
- Reactor模式
- ACE Reactor for Windows模型源码研究
- Reactor模式和NIO
- ReactiveCocoa/ReactiveCocoa
- reactor模型 preactor模型
- 高性能IO设计的Reactor和Proactor模式
- 使用Reactive Extensions(Rx),对短时间内多次发生的事件限流