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<<" ";
        }
    }
}

 

posted @ 2021-02-02 23:57  lipu123  阅读(78)  评论(0编辑  收藏  举报