您的位置:首页 > Web前端 > React

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: