zoukankan      html  css  js  c++  java
  • G. 4.奶牛(二进制枚举)

    农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
    给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
    维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

    Input

    第1行:一个整数V(1V25),表示需要的维他命的种类数。
    第2行:V个整数(1≤每个数1000),表示牛每天需要的每种维他命的最小量。
    第3行:一个整数GG(1G15),表示可用来喂牛的饲料的种数。
    下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。

    Output

    输出只有一行,包括牛必需的最小的饲料种数P后面有P个数,表示所选择的饲料编号(按从小到大排列)。
    如果有多个解,输出饲料序号最小的(即字典序最小)。

    Samples

    Input Copy
    4
    100 200 300 400
    3
    50  50  50  50
    200 300 200 300
    900 150 389 399
    Output
    2 1 3

    Source

    石光中学 FCS2018基础班day 6

    这个题就是一个二进制枚举,就是他要求字典序最小,那就是你二进制枚举的数越大越好,

    #include<iostream>
    #include<algorithm>
    #include<queue> 
    using namespace std;
    const int maxn=1e3+100;
    int vv[maxn];
    int g[maxn][maxn];
    int vis[maxn];
    int main(){
        int v;
        cin>>v;
        for(int i=0;i<v;i++){
            cin>>vv[i];
        }
        int t;
        cin>>t;
        for(int i=0;i<t;i++){
            for(int j=0;j<v;j++){
                scanf("%d",&g[i][j]);
            }
        }
        int ans=0x3f3f3f3f;
        int p; 
        for(int i=1;i<(1<<t);i++){
            int z=0;
            for(int j=0;j<v;j++){
                vis[j]=0;        
            }
            for(int j=0;j<t;j++){
                if((i>>j)&1){ 
                    z++;
                    for(int k=0;k<v;k++){
                        vis[k]+=g[j][k];
                    }
                }
            }
            int flag=1;
            for(int j=0;j<v;j++){
                if(vis[j]<vv[j]){
                    flag=0;
                    break;
                }
            }
            if(flag){
                if(ans>z){
                    ans=z;
                    p=i;
                }
            }
        }
        cout<<ans<<" ";
        for(int i=0;i<t;i++){
            if((p>>i)&1){
                cout<<i+1<<" ";
            }
        }
    }
  • 相关阅读:
    Matlab中transpose函数的使用
    Matlab中cell2mat的使用
    Matlab中find函数的使用
    Matlab中数组下标是logical,如何处理?
    Matlab中mat2cell的使用
    判断一棵树是否是另一棵树的子树
    链表中倒数第k个结点
    古德-图灵估计
    好书记录
    编程思路总结——递归
  • 原文地址:https://www.cnblogs.com/lipu123/p/14364890.html
Copyright © 2011-2022 走看看