暴力枚举,使用bitset优化
bitset在此处用作枚举状态空间
#include <iostream>
#include <fstream>
#include <string.h>
#include <bitset>
using namespace std;
#ifdef LOCAL
ofstream fout ("out.txt");
ifstream fin ("in.txt");
#else
ofstream fout ("holstein.out");
ifstream fin ("holstein.in");
#endif
int num1[50];
int res[50];
int num2[50][50];
bitset <16> minbit(0);
int main() {
int vc;
int num_vitamin;
fin >> num_vitamin;
for (int i = 0; i < num_vitamin; ++i)
fin >> num1[i];
int num_feed;
fin >> num_feed;
for (int j = 0; j < num_feed; ++j)
for (int i = 0; i < num_vitamin; ++i)
fin >> num2[j][i];
vc = 17;
for (int m = 0; m < (1<<num_feed); ++m)
{
bitset <16> bit(m);
memset(res, 0, sizeof(res));
for (int i = 0; i < num_feed; ++i)
{
if(bit[i])
{
for (int j = 0; j < num_vitamin; ++j)
{
res[j] += num2[i][j];
}
}
}
int flag = 1;
for (int i = 0; i < num_vitamin; ++i)
{
if(res[i] < num1[i])
{
flag = 0;
break;
}
}
if(!flag)
continue;
if(bit.count() < vc && bit.to_ulong() > minbit.to_ulong())
{
vc = bit.count();
minbit = bit;
}
}
fout<<vc;
for (int i = 0; i < num_feed; ++i)
{
if(minbit[i])
fout<<' '<<i+1;
}
fout<<endl;
return 0;
}