洛谷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 ans[1000];//这个数组是来存储解的。 
int a[1000];//表示牛每天需要的每种维他命的最小量。 
int b[1000][1000];//每种饲料包含的各种维他命的量的多少。
int c[1000];//每次搜索选的饲料编号 
int n,m,minn=100000000;
bool pd(int x)//这是判断每次选的那些饲料中的维生素之和是不是都大于等于牛每天需要的每种维他命的最小量的函数 
{
    for(int i=1; i<=n; i++)
    {
        int sum=0;
        for(int j=1; j<=x; j++)
        sum+=b[c[j]][i];//用一个sum累加 
        if(sum<a[i]) return false;//如果有一项维生素比牛需要的维生素要少,直接返回false 
    }
    return true;
}
void search(int t,int s)//搜索的函数 
{
    if(t>m)//边界
    {
        if(pd(s))//必须得满足条件
        {
            if(s<minn)//判断选的饲料的总数小于以前的最优解
            {
                minn=s;//替换掉
                for(int i=1; i<=minn; i++)
                {
                    ans[i]=c[i];//答案的数组也要被替换
                }
            }
        }
        return; //返回
    }
    c[s+1]=t;//把t放在数组里
    search(t+1,s+1);//搜索一步
    c[s+1]=0;//回溯一步
    search(t+1,s);//如果不选第t种饲料的操作
}
int main()//主函数部分
{
    cin>>n;//读入
    for(int i=1; i<=n; i++)
    cin>>a[i];//读入
    cin>>m;//读入
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=n; j++)
        cin>>b[i][j];//还是读入
    }
    search(1,0);//调用搜索函数
    cout<<minn<<' ';//输出
    for(int i=1; i<=minn; i++)
    cout<<ans[i]<<' ';//还是输出
    return 0;//结束程序
}

 

posted @ 2019-07-26 17:57  流照君  阅读(589)  评论(0编辑  收藏  举报