As I understand it, the qt client generates 100 addresses the first time it's run, and whenever a new address is required, it pulls one from the pool. at the same time, it generates a new one which gets added (keeping a constant pool of 100). This means that for every 100 addresses that get used, you have to make another backup of your wallet. Addresses don't only get pulled from the pool when you decide to create a new receiving address. They are used for 'change' transactions. These occur due to the way the protocol is designed.
As an example, imagine you buy your first bitcoins: lets say you buy 5, which get sent in one transaction to your first address. Now you decide you want to send 1 bitcoin to somebody - the client creates a transaction which spends the full balance of 5 BTC, 1 to the address of the person you are sending to, and 4 as 'change' back to yourself, a different address which you control. This address is pulled from the client's pool of 100 addresses, so you should back up after every 100 transactions.
I'm not sure exactly why it works like this, I'm sure there's a reason.
Armory is a client which works deterministically, meaning that new addresses are generated in a pre-determined manner. This means you only need to back up once. It's also a great way to store coins securely, if you have a spare old laptop to run an offline wallet.