Suppose, I have **N** **distinct** integers. I have to make **M non-empty sets** using these integers. An integer may not present in any of the sets and an integer can present in only one of the M sets. I have to print all possible ways to make **M** sets using these **N** integers.

For example, if I have **N = 3** integers which are **1**, **2** and **3**, then there are **6** possible ways to make **M = 2** sets:

**1. {1} {2}**

**2. {1} {3}**

**3. {2} {3}**

**4. {1,2} {3}**

**5. {1,3} {2}**

**6. {1} {2,3}**

How can I find out the number of ways to make **M** sets using **N** distinct integers according to the rule given above? What is the most efficient way to print all the possible ways?

I tried to solve this problem using dynamic programming, but I am having trouble to define DP states.