日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USACO-Section2.1 Healthy Holsteins (深度优先搜索)

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USACO-Section2.1 Healthy Holsteins (深度优先搜索) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2017-8-15

題目描述

1.喂給牛的飼料的種數最少 2.所需的飼料劑量最少 3.輸出飼料序號最小的

解答

我用的是dfs求出所有情況 1.最大種數從1開始到n,若當前種數有滿足條件的,就是他了,break即可 2.每次k從1開始為了節省數組r的空間 3.set函數!!!

代碼

/* ID: 18795871 PROG: holstein LANG: C++ */ #include<iostream> #include<fstream> #include<cstring> using namespace std; const int M = 25,N = 15;ifstream fin("holstein.in"); ofstream fout("holstein.out");int x[M+1],y[N+1][M+1]; //init int s[M+1]; //sum:now int r[10000][N+1]; //type:now bool f[N+1],res=false; int now,m,n,sum=0,k=1,qq;bool flag(){ //判斷當前是否符合條件for (int i=1;i<=m;i++){if (s[i]<x[i]) return false;}return true; }int fun(){ //求出當前所需的飼料劑量int res=0;for (int i=1;i<=m;i++){res+=s[i];}return res; }void cal(int j){ for (int i=1;i<=m;i++){s[i]+=y[j][i];} }void mul(int j){ for (int i=1;i<=m;i++){s[i]-=y[j][i];} }void set(int p){for (int i=1;i<=k;i++){for (int j=0;j<p;j++){if (!r[i][j]){r[i][j]=r[i-1][j];}}} }void dfs(int step,int cnt){if (step==n+1){k++;return ;}if (cnt==now){set(cnt);if (flag()){int fun_res=fun();if (sum==0||(sum!=0&&fun_res<sum)){qq=k;sum=fun_res;}res=true;}k++;return ;}for (int i=step+1;i<=n;i++){if (!f[i]){cal(i);r[k][cnt]=i;f[i]=true;dfs(i,cnt+1);f[i]=false;mul(i);}} }void show(int p){int i;fout<<now<<" ";for (i=0;i<now-1;i++){fout<<r[p][i]<<" ";}fout<<r[p][i]<<endl; }int main() {int i,j;fin>>m;for (i=1;i<=m;i++){fin>>x[i];}fin>>n;for (i=1;i<=n;i++){for (j=1;j<=m;j++){fin>>y[i][j];}}for (i=1;i<=n;i++){if (res) break;now=i;k=1;memset(s,0,sizeof(s));memset(f,false,sizeof(f)); memset(r,0,sizeof(r));dfs(0,0);}show(qq);return 0; }

上面的思路不是很明白了現在?!說一下現在的思路吧!
每種飼料我們可以選擇選或者不選,那么在這種情況下我們可以選擇深度優先搜索求解:
(1)為了使所求得的序列是最小的,那么我們應該首先選擇 ” 選 ” 。
(2)我用p數組標記當前飼料選否!r數組存儲當前的選擇時各種vit的和,q數組存放最后的答案,當我們來到最后一個飼料的時候,我們就要判斷當前的選擇是否能夠滿足我們對vit的要求,即r數組和v數組進行比較。需要注意的是,我們優先要求的是所需飼料種類最少,其次是序列號較小的那一個!
(3)最后輸出的時候,如果是最后一個的話,記得輸出換行符,否則的話,
輸出一個空格。

/* ID: 18795871 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> using namespace std;ifstream fin("holstein.in"); ofstream fout("holstein.out");const int M = 25, N = 15; int v[M+1],x[N+1][M+1],r[M+1]; int vv,gg,cnt; bool p[N+1],q[N+1];bool isOK(){int i;for (i=0;i<vv;i++){if (r[i]<v[i]) return false;}return true; } void dfs(int step,int num){if (step==gg){if (isOK()){if (num<cnt){cnt=num;for (int i=0;i<gg;i++){q[i]=p[i];}}}return ;}p[step]=1;for (int i=0;i<vv;i++){r[i]+=x[step][i];}dfs(step+1,num+1);p[step]=0;for (int i=0;i<vv;i++){r[i]-=x[step][i];}dfs(step+1,num); }int main(){int i,j; while (fin>>vv){for (i=0;i<vv;i++){fin>>v[i];}fin>>gg;for (i=0;i<gg;i++){for (j=0;j<vv;j++){fin>>x[i][j];}}cnt=N;dfs(0,0);fout<<cnt<<" ";int k=0;for (i=0;i<gg;i++){if (q[i]){k++;if (k<cnt) fout<<i+1<<" ";else fout<<i+1<<endl;} }}return 0; }

總結

以上是生活随笔為你收集整理的USACO-Section2.1 Healthy Holsteins (深度优先搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。