Dobble/SpotIt card generator
Python 2, 192 162 bytes

I have an argument that this produces the maximum set of cards for every scenario and it does handle the 3 test cases.



from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&amp;set(C[0]))==1&lt;s))


Try it online!

Algorithm

Given an alphabet a and a card size s, take all combinations of s elements in a and call it C,  then:


Take the first element of C, call it C0
Save C0
Remove all elements fromC that have a union with C0 not equal to 1
Repeat with second element of C
Continue until C is empty


Then print the saved elements.

Argument

Some non-empty subset of C is our maximal solution, K. Since it contains at least one element and any two elements are indistinguishable, choose an arbitrary element, C0, of C to be in K. For any element e in the K, the cardinality of e union x is 1 for x != e in K; so eliminate all elements in C whose union with C0 does not have cardinallity 1. By the same reasoning, choose a new arbitrary element in C, add it to K, and reduce C. Eventually C is the empty set and K will be the maximal solution because at no point did we choose an element that was distinguishable from any other element.



Test Cases

These test cases were written before I realized that the printing was a requirement. 

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
&gt;&gt; ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
&gt;&gt; ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
&gt;&gt; ['abcd'] True


Update


+9 [16-12-07] Fit the print requirement
-11 [16-12-07] Golfed out my R variable
-30 [16-12-09] Golfed out my K variable, Thanks to @Leo!