您的位置:首页 > 编程语言 > C语言/C++

USACO Healthy Holsteins

2012-06-27 17:39 288 查看
深搜,注意剪枝

/*
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c