Start from problem 1 and work your way up - they get gradually harder to solve as complete more. They are simple yet require flexing your algorithm-development muscles, which also help you to think about coding in an "efficient enough" manner: some problems can be implemented in ways that take 10 hours to run, or .001 seconds.
These might be good exercises, say, for getting the basics of a new programming language. But not really for interesting projects. They don't involve making configuration files, command-line or graphical interfaces, networking, etc. They're hardly something you'll want to use later.
A lot of those problems require an advanced understanding of mathematics to properly solve; i.e., there is a "trick" that you would only know if you had familiarized yourself with it earlier in the course of your mathematical journey. But +1 for Project Euler!
I've found it a great way to learn those tricks. Once I've solved a problem, working through the way somebody else did it, perhaps in an order of magnitude less time or in an idiomatically different language, has often given me a deeper understanding of the problem. I've learned a couple algorithmic tricks that way, too.
Also, there are some paired problems where the first is small enough to be feasible by a naive solution, but the second would take far too long, and you have to figure out the trick. There's a pair that requires finding the maximum path down a pyramid of numbers, for example, and the second pyramid is several times taller.
Many, however, just need the realization that "there has to be a better way to implement this". If you're just brute forcing the answer, and have no clue, turning to Google for efficient Fibonacci routines or whatnot is fine, because you've just taught yourself some new mathematical concept.
http://projecteuler.net/
Start from problem 1 and work your way up - they get gradually harder to solve as complete more. They are simple yet require flexing your algorithm-development muscles, which also help you to think about coding in an "efficient enough" manner: some problems can be implemented in ways that take 10 hours to run, or .001 seconds.