[USACO][枚举]Healthy Holsteins

这道题看起来背包其实是二进制枚举哒!

题意:

一包饲料有三种营养素含量,要求搭配饲料使得每种营养素累加之和不小于目标值。给出研究的营养素种类数目、每种营养素的目标值、备选饲料数目,以及每种饲料的营养素含量,求出最少选取多少饲料可以满足要求。(每个规格的饲料只能用一次)

遇到的问题:

* cpp重载运算符+我透啊好迷惑!找时间补补郭伟......
* 问题都是简单的,不要总想着自己不会的东西,只要动脑一定可以解决!!
* 呃...ostream&重载又又又忘记return os了......
* 本题看起来背包其实是二进制枚举哒!

代码:

/*
ID :ggy_7781
TASK :holstein
LANG :C++11
*/
#include <bits/stdc++.h>

using namespace std;
#define maxV 29
#define maxG 15

int V,G;

int target[maxV];
int a[maxG][maxV];
bool cmp(int a[], int b[])
{
    for(int i = 0;i <V;i ++)
        if(a[i] > b[i])
        return false;
    return true;
}
int main()
{
    freopen("holstein.in","r",stdin);
    freopen("holstein.out","w",stdout);
    cin>>V;
    for(int i =0 ;i < V;i ++)
        cin>>target[i];
    cin>>G;
    for(int i =0 ;i <G;i ++)
    {
        for(int j = 0;j < V;j ++)
        {
            cin>>a[i][j];
        }
    }
    int ret = G;
    int method = pow(2,G) - 1;
    for(int i = 1;i < pow(2,G);i ++)
    {
        int tmp = i;
        int now[maxV];
        for(int k = 0;k <V;k ++)
            now[k] = 0;
        int num = 0;
        for(int j = 0;j < G;j ++)
        {
            //cout<<(tmp & 1);
            if(tmp & 1)
            {
                num ++;
                for(int k = 0;k <V;k ++)
                    now[k] = now[k] + a[j][k];
            }
            tmp = tmp >> 1;
        }
        if(cmp(target,now) && num < ret)
        {
            ret = num;
            method = i;
        }
        //cout<<endl;
    }
    cout<<ret;
    int tmp = method;
    for(int i = 0;i < G; i++)
    {
        if(tmp & 1)
            cout<<" "<<i+1;
        tmp = tmp >> 1;
    }
    cout<<endl;
    return 0;
}
上一篇:kubernetes之健康状态检测


下一篇:English trip V2 - 3. A Healthy Diet Teacher:Corrine Key:各种前缀 im- un- in- re- over- under-