(转)UVALive3693 Balancing the Scale --- 枚举+状压压缩

题意:给出一个式子,和16个数字,问符合以下两个式子的情况有多少种 
x1* 4 + x2* 3 + x3* 2 + x4 = x5 + x6* 2 + x7* 3 + x8* 4 
y1* 4 + y2* 3 + y3* 2 + y4 = y5 + y6* 2 + y7* 3 + y8* 4

题解: 参考 http://www.mamicode.com/info-detail-865460.html

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = (1 << 16);
const int M = 12000;
vector<int> sta[M];
int x[16], num[16], cnt[N];

void init() {

    for(int i = 1; i < 16; i++)
        scanf("%d", &num[i]);

    sort(num, num + 16);
    for(int i = 0; i < M; i++)
        sta[i].clear();
    memset(cnt, 0, sizeof(cnt));
}

bool judge(int s) {
    int count = 0;
    for(int i = 0; i < 16; i++)
        if(s & (1 << i)) 
            x[count++] =  num[i];

    return count == 4;
}


long long solve() {
    long long ans = 0;
    for(int i = 0; i < N; i++) 
        if(judge(i)) {
            do{
                int t = 4 * x[0] + 3 * x[1] + 2 * x[2] + x[3];
                for(int j = 0; j < sta[t].size(); j++) 
                    if((i & sta[t][j]) == 0)
                        cnt[i | sta[t][j]]++;
                sta[t].push_back(i);
            }while(next_permutation(x, x + 4));
        }
    for(int i = 0; i < N; i++)
        ans += cnt[i] *  cnt[i ^ (N - 1)];
    return ans / 2;
}

int main() {
    int cas = 1;
    while(scanf("%d", &num[0]) != EOF && num[0]) {
        init();
        printf("Case %d: %lld\n", cas++, solve());
    }
    return 0;
}

UVALive - 3693 Balancing the Scale 枚举 + 状态压缩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值