这道题看起来背包其实是二进制枚举哒!
题意:
一包饲料有三种营养素含量,要求搭配饲料使得每种营养素累加之和不小于目标值。给出研究的营养素种类数目、每种营养素的目标值、备选饲料数目,以及每种饲料的营养素含量,求出最少选取多少饲料可以满足要求。(每个规格的饲料只能用一次)
遇到的问题:
* 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; }