洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins

题目描述

农民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

做了好久做不出来,在精髓那里卡住,弱鸡求过,也是暴力搜索,数据之间的转换有点复杂,有点动归的思想

 

#include<bits/stdc++.h>
using namespace std;
int species,mix[30],Min[30];
//维生素种类,维生素标准,运算中维生素的和 (用来和维生素标准比较 ) 
int n,fodder[20][30],k=0,t=50;
//n中食物,第[n]中食物含有的第[i]中维生素为为fodder[n][i],
//k为运算中的食物种类,t为最终的食物种类 
int ans[20],output[20];
//运算中的食物种类,最终输出的食物种类
 
bool juge() //用来判断是否满足条件 
{
	for(int i=0;i<species;i++)
	if(Min[i]<mix[i]) return false;
	return true;
}
void search(int x)
{	
	if(juge()) 
	{ //这里是精髓,
		if(k<t)
		{
			t=k;
			for(int i=0;i<k;i++)
			output[i]=ans[i];
		}
		return ;
	}
	if(x==n) return ;
	
	for(int i=0;i<species;i++) //对于第x种食物,选择拿 
	Min[i]+=fodder[x][i];
	ans[k++]=x;
	search(x+1);
	
	for(int i=0;i<species;i++)//选择不拿 
	Min[i]-=fodder[x][i];
	k--;
	search(x+1);
} 
int main()
{
	cin>>species;
	
	for(int i=0;i<species;i++) 
	cin>>mix[i];
	
	cin>>n;
	
	for(int i=0;i<n;i++)
	for(int j=0;j<species;j++)
	cin>>fodder[i][j];
	
	search(0);
	
	cout<<t<<' ';
	for(int i=0;i<t;i++)
	cout<<output[i]+1<<' ';
	
	return 0;
} 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值