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 (深度优先搜索)相关推荐

  1. 洛谷 P1460 健康的荷斯坦奶牛 Healthy Holsteins

    P1460 健康的荷斯坦奶牛 Healthy Holsteins 题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保 ...

  2. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  3. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  4. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  5. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  6. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  7. c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

  8. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  9. 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...

    深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HTML文件 ...

  10. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

最新文章

  1. excel中对比两个sheet,找出匹配不上的
  2. Java中集合(七)Collections 一个操作集合的工具类
  3. 来入门一下kotlin吧
  4. python建模分析实操_城市公交站点设置优化模型-基于Python
  5. 二十三、中断(控制计算机硬件,避免使用0000:0000-0000:03FF内存地址)
  6. python date2num_坚持mdates.date2num
  7. 二叉树的先序,中序,后序,层次的递归及非递归遍历
  8. html css . doc,html+CSS基础.doc
  9. vb.net 同时给多个属性赋值_一个float值赋值给double,结果是什么?进来重温一下类型提升吧...
  10. 超简单!利用查看源代码+正则表达式复制百度文库无法复制内容
  11. IT小公司避坑及生存指南
  12. .length和.length()
  13. 阿里云人脸对比API使用
  14. PA、PB及RS功率计算
  15. c语言书面作业,巢湖学院2011级网络工程1,2班C语言书面作业(江家宝)版
  16. CodeForces 786A Berzerk 博弈?BFS瞎搞
  17. pyQt5-label常用方法
  18. swagger2接口文档
  19. Sensing Pressure Distribution on a Lower-Limb Exoskeleton
  20. php微信支付结果通知接收,浅析PHP微信支付通知的处理方式

热门文章

  1. 绕固定坐标轴旋转与绕自身坐标轴旋转一致性证明
  2. 有没有人带?这些都是学习生信的一大助力!
  3. 分享我们承建的三篇NAR的数据库
  4. Audirvana for Mac(高品质音乐播放器)
  5. 【原型设计】第二节:Axure RP9制作自己的元件库的操作教程
  6. python需要的基础_推荐收藏!小白不要怕!一周学全Python面试基础(2)
  7. Linux基础学习三:VMware和CentOS的安装详细图文教程
  8. python色标_Python: 气象绘图实例之台风
  9. Java工作笔记-使用jquery.timer.js实现数据自动刷新
  10. Qt5.7+Opencv2.4.9人脸识别(二)人脸采集