2.8 Healthy Holsteins
【问题描述】
农民约翰以他有世界上最健康的奶牛为骄傲。他知道每种饲料的各种维生素的含量,以及一头牛每天需要
最少的维生素的量。请你帮助约翰喂养这些奶牛,使得它们能够保持健康,并且消耗的饲料种类最少。
【输入格式】
第一行:一个数 V(1≤V≤25),表示维生素的种类数。
第二行:V 个整数,表示一头牛一天需要的维生素量。一个整数对应一种维生素。
第三行:一个数 G(1≤G≤15),表示饲料的种类数。
第四行:G 个整数,表示每种饲料的各种维生素的含量。
【输出格式】
输出共一行。第一个数是需要的最少的饲料种类数。从第二个数开始,输出所需的饲料种类序号。请输出
字典序最小的解。
【分析】
本题最多只有 15 种饲料。如果尝试所有取法,也只有 2
15=32768 种状态,因此完全可以枚举所有方案。
考虑一种饲料,它要么用来喂牛,要么扔到一边去。用来喂牛可以用“1”表示,放到一边用“0”表示。
于是,G 种饲料的状态可以转化成一个 G 位的二进制数。这样,枚举 0 到 2
G-1 的数,就枚举了所有状态。
当然这只是一种思路。如果不能熟练使用位运算,这种做法的编程复杂度会比 DFS 高很多。
【代码】
#include <iostream>
using namespace std;
int v, req[26];
int g, vitamin[16][26];
int Min=100, minstat=0; // Min表示需要最少饲料数,minstat表示目前的最优状态
int count(int stat) // 统计stat中“1”的个数
{
int r=0;
while (stat)
{
r+=stat & 1;
stat>>=1;
}
return r;
}
int main()
{
cin>>v;
for (int i=1; i<=v; i++) cin>>req[i];
cin>>g;
for (in