P1460 健康的荷斯坦奶牛 Healthy Holsteins

题目描述

点这里

文字描述

农民 John 以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。

给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。

维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

输入格式

第一行一个整数 v,表示需要的维他命的种类数。
第二行 v 个整数,表示牛每天需要的每种维他命的最小量。

第三行一个整数 g,表示可用来喂牛的饲料的种数。
下面 g 行,第 n 行表示编号为 n 饲料包含的各种维他命的量的多少。

输出格式

输出文件只有一行,包括牛必需的最小的饲料种数 p;后面有 p 个数,表示所选择的饲料编号(按从小到大排列)。

如果有多个解,输出饲料序号最小的(即字典序最小)。

解题思路

1.先枚举个数len(选多少种饲料)

2.用dfs枚举在g个中选len个(next_permutation也可以)

3.如果选的饲料的v种维他命均>=牛每天需要的每种维他命的最小量,
就把这种选法对应的所有饲料编号存下来作为一种方案

4.最后把所有方案按字典序排好,取最小的输出

代码

没办法,就是喜欢(只会)STL

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[30];
int b[20][30];
int p[20];
int sum[30];
signed main() {
int v;
cin >> v;
for (int i = 1; i <= v; i++)
cin >> a[i];
int g;
cin >> g;
for (int i = 1; i <= g; i++) {
for (int j = 1; j <= v; j++) {
cin >> b[i][j];
}
}
vector<set<int> > ans;
set<int> tmp;
for (int len = 0; len <= g; len++) {
memset(p, 0, sizeof p);
int cnt = g;
for (int i = 0; i < len; i++) {
p[cnt] = 1;
cnt--;
}
do {
memset(sum, 0, sizeof sum);
for (int i = 1; i <= g; i++) {
if (p[i] == 1) {
for (int j = 1; j <= v; j++) {
sum[j] += b[i][j];
}
}
}
bool ok = true;
for (int i = 1; i <= v; i++) {
if (sum[i] < a[i]) {
ok = false;
break;
}
}
if (ok) {
tmp.clear();
for (int i = 1; i <= g; i++) {
if (p[i] == 1) {
tmp.insert(i);
}
}
ans.push_back(tmp);
}
} while (next_permutation(p + 1, p + g + 1));
}
sort(ans.begin(), ans.end(), [](set<int> x, set<int> y)->bool{
if (x.size() != y.size()) {
return x.size() < y.size();
}
for (auto ix = x.begin(), iy = y.begin(); ix != x.end() && iy != y.end(); ix++, iy++) {
if (*ix != *iy) {
return *ix < *iy;
}
}
return 0;
});
cout << ans.front().size() << " ";
for (auto i = ans.front().begin(); i != ans.front().end(); i++) {
cout << *i << " ";
}
return 0;
}

戳他

点赞的dalao AK IOI!(ง•_•)ง

posted on   可爱楷玩算法  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示