Dynamic programming is about dividing solution into problems then solving them by globally optimal solution (not neccessarily in order of arrival).
While greedy programming is about solving problems step by step, using locally optimal solution, not considering globally optimal solution at a given moment.
1. Let's divide problems on: most optimal cpu-speed wise, memory-size wise, and target-function wise.
Functions can be written as character String using mathematical function notation,
for example: String s1 is "f(x1)+f(x2)".
Target function is (any) function, complex or not, that describes how optimal solution is given it's variables (x1 and x2 in above case). These variables can represent available resources, for example amount of liquid in vial and energy used.
2. Stitie space is 3D space. Let's place problems by these keys on 3-axes.
On first axis let's sort problems by cpu usage.
On second axis let's sort problems by memory usage.
On thrid axis user can have problems sorted by single target function, or assigned to their target functions and sorted alphabetically.
3. According to available resources (memory, speed, other) let's take problems to solve from an appropriate axes (coordinates) and position on such.
See also: Greedy Algorithms, Dynamic Programming.