P1460 健康的荷斯坦奶牛 Healthy Holsteins
- 168通过
- 340提交
- 题目提供者该用户不存在
- 标签USACO
- 难度普及-
提交 讨论 题解
最新讨论
- 2个数据超时,求优化
题目描述
农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
输入输出格式
输入格式:
第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。
第2行:V个整数(1<=每个数<=1000),表示牛每天需要的每种维他命的最小量。
第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的种数。
下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。
输出格式:
输出文件只有一行,包括
牛必需的最小的饲料种数P
后面有P个数,表示所选择的饲料编号(按从小到大排列)。
如果有多个解,输出饲料序号最小的(即字典序最小)。
输入输出样例
输入样例#1:
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399
输出样例#1:
2 1 3
说明
USACO 2.1
翻译来自NOCOW
分析:因为每个饲料可以吃也可以不吃,所以想到0-1背包,但是记录状态比较麻烦,而且数据这么小,不妨试试暴搜,可以搜索子集,然后检验是否合适,或者一个饲料一个饲料的搜索,要么选要么不选,注意判断一下就好了.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int v, a[30], G[16][30], g, ans[16], num = 10000000,num1,vis[16]; bool check() { for (int i = 1; i <= v; i++) if (a[i] > 0) return false; return true; } void biaoji() { int temp = 0; for (int i = 1; i <= g; i++) if (vis[i] == 1) ans[++temp] = i; } void dfs(int x) { if (check()) { if (num1 < num) { num = num1; biaoji(); return; } } if (x > g) return; for (int i = 1; i <= v; i++) a[i] -= G[x][i]; vis[x] = 1; num1++; dfs(x + 1); for (int i = 1; i <= v; i++) a[i] += G[x][i]; vis[x] = 0; num1--; dfs(x + 1); } int main() { scanf("%d", &v); for (int i = 1; i <= v; i++) scanf("%d", &a[i]); scanf("%d", &g); for (int i = 1; i <= g; i++) for (int j = 1; j <= v; j++) scanf("%d", &G[i][j]); dfs(1); printf("%d ", num); for (int i = 1; i <= num; i++) printf("%d ", ans[i]); return 0; }