代码一小错,BUG找一年

能体会到会计差2毛平账,找三天三夜的痛了

set.end()

set<int> A;
A.end()不是指向集合A最后一个元素的指针
--A.end()才是!
A.end()实际存放的是A.size()的值(所以set求元素个数时间复杂度是O(1)的)!

坑的来源:洛谷p1460 健康的荷斯坦奶牛 Healthy Holsteins
找坑用时:起始:01-28 19:23:38 结束:01-28 22:34:38 共计3小时

#include<bits/stdc++.h>
using namespace std;
int wss[26];
int sl_nutrition[16][26];
int v,g;

struct node{
set<int> sl;
int nutrition[26];
node(){};
node(int kind){
this->sl.insert(kind);
for(int i=1;i<=v;i++) this->nutrition[i]=sl_nutrition[kind][i];
};
};
queue<node> q;

void bfs(int g){
for(int i=1;i<=g;i++) q.push(node(i));
while(!q.empty()){
node now=q.front();
q.pop();
for(int i=1;i<=v;i++){
if(now.nutrition[i]<wss[i]) break;
if(i==v){
cout<<now.sl.size()<<" ";
for(set<int>::iterator it=now.sl.begin();it!=now.sl.end();it++) cout<<*it<<" ";
exit(0);
}
}
for(int i=*(--now.sl.end())+1;i<=g;i++){//坑的位置
node next_node=now;
next_node.sl.insert(i);
for(int j=1;j<=v;j++) next_node.nutrition[j]+=sl_nutrition[i][j];
q.push(next_node);
}
}
}
int main(){
cin>>v;
for(int i=1;i<=v;i++) cin>>wss[i];
cin>>g;
for(int i=1;i<=g;i++)
for(int j=1;j<=v;j++)
cin>>sl_nutrition[i][j];
bfs(g);
}