UVA - 10604 Chemical Reaction

来源:互联网 发布:初中生考编程 编辑:程序博客网 时间:2024/05/19 13:56
有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;}


原创粉丝点击