usaco Healthy Holsteins
生活随笔
收集整理的這篇文章主要介紹了
usaco Healthy Holsteins
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這題拖了很久,一開始想用dfs結果寫不出來,然后在網上看到應該枚舉而且又看到這種狀態壓縮枚舉算學到東西了,接著又看到用bfs的。
/*
ID: nanke691
LANG: C++
TASK: holstein
*/
#include<iostream>
#include<fstream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{int state;//用位來記錄路徑,即使用過哪幾種飼料int ver[26];//保存狀態值,short cur;//當前選擇的編號最大的飼料short cnt;//已選擇的種類數
};
int hol[20][30];
int V,G,aim[30],len,ans;
queue<node> Q;
bool compare(int *a)//判斷是否符合條件
{for(int i=1;i<=V;i++)if(a[i]<aim[i])return false;return true;
}
void BFS()
{node s,f;for(int i=1;i<=G;i++){for(int j=1;j<=V;j++)s.ver[j]=hol[i][j];s.state=(1<<(i-1));s.cur=i;s.cnt=1;Q.push(s);}len=100000000;while(!Q.empty()){f=Q.front();Q.pop();if(f.cnt<=len && compare(f.ver)){len=f.cnt; ans=f.state;break;}for(int i=f.cur+1;i<=G;i++){for(int j=1;j<=V;j++)s.ver[j]=f.ver[j]+hol[i][j];s.cnt=f.cnt+1;s.cur=i;s.state=(f.state | (1<<(i-1)));//記錄下當前選取的編號Q.push(s);}}
}
int main()
{freopen("holstein.in","r",stdin);freopen("holstein.out","w",stdout);scanf("%d",&V);for(int i=1;i<=V;i++)scanf("%d",&aim[i]);scanf("%d",&G);for(int i=1;i<=G;i++)for(int j=1;j<=V;j++)scanf("%d",&hol[i][j]);BFS();cout<<len<<' ';int flag=0;for(int i=1;i<=G;i++){if((ans &(1<<(i-1)))!=0){if(!flag)cout<<i,flag=1;else cout<<' '<<i;}}cout<<endl;
}
第二種方法就是簡單的bfs不過他記錄路徑的方法很巧妙,學習了。代碼直接搬過來了
/*
ID :jinbo wu
LANG: C++
TASK:holstein
*/
#include<bits/stdc++.h>
using namespace std;
int a[30];
int b[20][30];
int ans[25];
int t[25];
int sum,mark,flag,cnt;
int main()
{freopen("holstein.in","r",stdin);freopen("holstein.out","w",stdout);int n,l;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);int g;scanf("%d",&g);for(int i=0;i<g;i++){for(int j=0;j<n;j++)scanf("%d",&b[i][j]);}int maxn=1<<g;sum=maxn;for(int i=1;i<=maxn;i++){flag=0;cnt=0;int temp=i;while(temp){if(temp&1) cnt++;if(cnt>=sum){flag=1;break;}temp>>=1;}if(flag)continue;temp=i;l=0;memset(t,0,sizeof(t));while(temp){if(temp&1){for(int j=0;j<n;j++)t[j]+=b[l][j];}temp>>=1;l++;}for(int j=0;j<n;j++){if(t[j]<a[j]){flag=1;break;}}if(flag==0){sum=cnt;mark=i;}}printf("%d",sum);l=1;while(mark){if(mark&1)printf(" %d",l);mark>>=1;l++;}printf("\n");
}第二種方法就是簡單的bfs不過他記錄路徑的方法很巧妙,學習了。代碼直接搬過來了
總結
以上是生活随笔為你收集整理的usaco Healthy Holsteins的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烟鬼专辑封面是谁画的啊?
- 下一篇: 求一个社会个性签名。