Math 301 seems to me to be a course without a mission. Originally it was intended as a service course for computer science majors, but the Information & Computer Sciences Department then decided to offer their own course.
As far as I can see, discrete mathematics can be any elementary mathematics not involving calculus. Almost any choice of topics for Math 301 is going to overlap other mathematics courses. I taught the course the first semester it was offered, and right away I decided that I was not going to teach any topics from probability theory, since almost all my students either had had our elementary probability course or would take it eventually. I was also not willing to teach the usual elementary material on sets, relations, and functions, because I don't think I have anything interesting to say on those topics, and from past experience I don't believe that teaching those ideas out of context does students any good .
Somebody suggested the book by Rosen, and that looked good to me, since it was oriented towards computer science. (Rosen is affiliated with Bell Labs.) In looking through Rosen's book, I decided to start with Chapter 2, Algorithms. This seemed like it would be interesting to teach, and students generally do not get much introduction to algorithmic thinking in our other math courses (except possibly in Numerical Analysis, which many students will never take). The material on algorithms would also teach students the basic concepts of number theory -- such things as prime factorization, greatest common divisors, and least common multiples. These are ideas that I believe that anyone with a degree in mathematics should know about, but they usually don't get covered in high school or college algebra courses.
As the semester went on, I realized that the course was turning out to be largely a treatment in the idea of recursion, looked at from several different points of view. I emphasized recursive algorithms more than Rosen does, and then went on to teach proof by induction, which simply amounts to applying the idea of recursion to logic rather than numerical calculations. After that, I skipped to the topic of recurrence relations and how to solve them. Then for the last third of the course, I did a little graph theory, especially emphasizing applications of trees.
One of the main difficulties in the course was the fact that Rosen discusses algorithms by means of "pseudo-code," which look pretty much like Pascal. Since the level of code involved is quite simple, I assumed that those few students who had not done any computer programming could quickly pick it up, but it turns out to cause them a great deal of trouble. At my suggestion, the Math Department has now made a course in programming a prerequisite to Math 301.
The other noticeable problem is students' lack of that fabled quality called ``mathematical maturity.'' Calculus I is the only prerequisite for the course, which in a way is reasonable, since the course doesn't actually use any calculus at all. But I've noticed that a number of students in the course are simply not mathematically literate. They cannot read even a fairly simple statement containing mathematical symbols. For instance, a student came into my office saying that he couldn't understand the idea of congruence modulo m. I said to him, "Well, saying that two numbers are congruent modulo m just means that their difference is a multiple of m." That sounded pretty simple to him, and he complained that it never explained that in the book. I pointed to the formal definition in the book, namely, "... a is congruent to b modulo m if m divides a-b." ``Oh yeah,'' he said, ``I guess that does say the same thing, but your way of saying it is clearer to me.'' There have been dozens of examples of things like that during the semester. In fact, I would guess that almost half the time when students come to my office, it's because they can't understand what a homework problem says.
In a way, I like the fact that the course gives me a venue for teaching students how to read mathematics, and how to understand really rudimentary mathematical thinking. On the other hand, it does keep the course from moving ahead very fast.