深搜,注意剪枝
/*
ID: wangxin12
PROG: holstein
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
int V;
vector<int> need;
int G;
int feeds[15][25] = { 0 };
bool selected[15] = {false};
int least = 16;
vector<int> result;
bool check() {
int needs[25] = { 0 };
int sum = 0;
for(int m = 0; m < G; m++) {
if(selected[m]) sum++;
}
if(sum >= least) return false;
for(int i = 0; i < V; i++) {
for(int j = 0; j < G; j++) {
if(selected[j]) {
needs[i] += feeds[j][i];
}
}
}
for(int k = 0; k < V; k++) {
if(needs[k] < need[k]) return false;
}
return true;
}
void update() {
result.clear();
int sum = 0;
for(int i = 0; i < G; i++) {
if(selected[i]) {
sum++;
result.push_back(i+1);
}
}
least = sum;
}
void DFS(int level) {
if(level >= G) return;
selected[level] = true;
if(check())
update();
else DFS(level + 1);
selected[level] = false;
if(check())
update();
else DFS(level + 1);
return;
}
int main() {
//input
ifstream fin("holstein.in");
fin>>V;
int i = 0, j = 0;
int temp;
for(i = 0; i < V; i++) {
fin>>temp;
need.push_back(temp);
}
fin>>G;
for(i = 0; i < G; i++) {
for(j = 0; j < V; j++) {
fin>>temp;
feeds[i][j] = temp;
}
}
fin.close();
//calculate
DFS(0);
//Output
ofstream fout("holstein.out");
fout<<least<<" ";
for(temp = 0; temp < result.size() - 1; temp++) fout<<result[temp]<<" ";
fout<<result[temp]<<endl;
fout.close();
return 0;
}
http://hi.baidu.com/kaik51/blog/item/c566d2c4fab741c339db491a.html