Algorithm for arranging elements into different sized buckets
Your problem can be solved in polynomial time.

You mention two possible goals and say you'd be happy with a  solution to either.  The first goal isn't well-defined, so I'll describe a solution to the second goal.  I can see two possible approaches: (a) use integer linear programming (ILP), (b) use network flow.  The former will be simple to implement, and is flexible (if you later have new constraints it'll be easy to add them), but if you're unlucky, the running time could be exponential.  The second has the advantage of running in polynomial time, but it might be more work to implement.  fade2black described the ILP approach well, so I'll describe the network flow approach.

To solve the problem with network flow, formulate this as a minimum-cost network circulation problem.  In network flow, each edge has a capacity: an upper bound on the amount of flow through that edge.  Minimum-cost circulation also allows you to specify a lower bound on the amount of flow through that edge, and the per-unit cost of sending flow through that edge.

We'll construct a directed graph with a source node $s$, a node $u_i$ for each item, a node $v_j$ for each buyer, and a sink node $t$.  Add edges $s \to u_i$ with cost 0, lower bound $1$, and upper bound (capacity) $1$.  Add edges $u_i \to v_j$ with cost equal to the negative of the amount buyer $j$ will pay for item $i$, lower bound $0$,  and upper bound (capacity) $1$.  Add edges $v_j \to t$ with cost 0, lower bound equal to the quota for buyer $j$, and upper bound $\infty$.  Finally, add an edge $t \to s$ with cost 0, lower bound 0, and upper bound $\infty$.  Now look for the minimum-cost circulation in this graph.  That will correspond to a solution that maximizes the revenue, subject to the requirement that all quotas must be filled.