这题利用了二进制表示状态
每个客户的需求可以表示为一个数字
例如
题目给出feature总数目为8个
然后某个客户要求要有 第1 、4、7个特征
那么这个客户的需求状态可以用二进制表示为
01001001
所以很显然,当feature总数为n个时
任意的需求状态 都可以用 0 到 (2^n)-1中的某个数字来表示
然后就是对所有的状态进行一个遍历,找出bestState ,再利用位运算进行输出
我也是看某大神的
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
int max_cost, min_cost, f_num, c_num;
int f_cost[21], c_req[21][2], cus_satis[21], f_choose[21], cus_buy[21], bestState;
double PI;
int sales, total_cost, total_cus, profit_margin, total_feature;
int binV[21];
void inti() {
PI = 0;
sales = 0;
total_cost = 0;
total_cus = 0;
profit_margin = 0;
total_feature = 0;
}
int main() {
int k = 1;
for (int i = 0; i < 21; i++) {
binV[i] = k;
k *= 2;
}
int t, i, j, temp, state, coun;
scanf("%d", &t);
coun = 0;
while (t--) {
inti();
scanf("%d%d%d%d", &min_cost, &max_cost, &f_num, &c_num);
for (i = 0; i < f_num; i++) {
scanf("%d", &f_cost[i]);
}
int total;
for (i = 0; i < c_num; i++) {
scanf("%d", &c_req[i][0]);
total = 0;
for (j = 0; j < c_req[i][0]; j++) {
scanf("%d", &temp);
total += binV[temp - 1];
}
c_req[i][1] = total;
scanf("%d", &cus_buy[i]);
}
int curCost, curCus, curSales, curFeture;
double curPI;
for (state = 0; state < binV[f_num]; state++) {
curCost = curCus = curSales = curFeture = 0;
curPI = 0;
for (i = 0; i < f_num; i++) {
if (state & binV[i]) {
curCost += f_cost[i];
curFeture++;
}
}
if (curCost < min_cost || curCost > max_cost)continue;
for (i = 0; i < c_num; i++) {
if ((state | c_req[i][1]) == state) {
curSales += cus_buy[i];
curCus++;
}
}
curPI = curSales * 1.0 / curCost * 1.0;
bool update = false;
if (curPI > PI) {
update = true;
} else if (curPI == PI) {
if (curSales - curCost > profit_margin) {
update = true;
} else if (curSales - curCost == profit_margin) {
if (curFeture < total_feature) {
update = true;
} else if (curFeture == total_feature) {
if (curCus > total_cus) {
update = true;
}
}
}
}
if (update) {
PI = curPI;
sales = curSales;
total_cost = curCost;
profit_margin = curSales - curCost;
total_feature = curFeture;
total_cus = curCus;
bestState = state;
}
}
printf("Feature Set %d\n", ++coun);
printf("%.3f\n", PI);
printf("%d\n", sales);
printf("%d\n", total_cost);
for (i = 0; i < f_num; i++) {
if (bestState & binV[i]) {
printf("%d", i + 1);
i++;
break;
}
}
for (; i < f_num; i++) {
if (bestState & binV[i]) {
printf(" %d", i + 1);
}
}
printf("\n");
for (i = 0; i < c_num; i++) {
if ((bestState | c_req[i][1]) == bestState) {
printf("%d", i + 1);
i++;
break;
}
}
for (; i < c_num; i++) {
if ((bestState | c_req[i][1]) == bestState) {
printf(" %d", i + 1);
}
}
printf("\n");
}
}