# 【动态规划】Gentlemen

## 1244. Gentlemen

Time Limit: 0.5 second
Memory Limit: 16 MB
Let's remember one old joke:
Once a gentleman said to another gentleman:
— What if we play cards?
— You know, I haven't played cards for ten years…
— And I haven't played for fifteen years…
So, little by little, they decided to resurrect their youth. The first gentleman asked a servant to bring a pack of cards, and before starting playing out weighed in his hand the pack.
— It seems to me, one card is missing from the pack… — he said and gave the pack to the other gentleman.
— Yes, the nine of spades, — the man agreed.
An incomplete pack of cards is given. The program should determine which cards are missing.

### Input

The first line contains a positive integer, which is the weight in milligrams of the given incomplete pack. The second line contains an integer N, 2 ≤ N ≤ 100 — the number of cards in the complete pack. In the next N lines there are integers from 1 to 1000, which are the weights of the cards in milligrams. It's guaranteed that the total weight of all cards in the complete pack is strictly greater than the weight of the incomplete pack.

### Output

If there is no solution, then output the single number 0. If there are more than one solutions, then you should write −1. Finally, if it is possible to determine unambiguously which cards are missing in the incomplete pack as compared to the complete one, then output the numbers of the missing cards separated with a space in ascending order.

### Samples

input output
270
4
100
110
170
200

2 4

270
4
100
110
160
170

-1

270
4
100
120
160
180

0


#include <algorithm>
#include <cstdlib>
#include <cstdio>
using std::sort;
long weight;
long n;

struct node
{
long w;
long i;
};
long card[110];
unsigned char f[101][100001];
long ans[110];
long top = 0;

bool cmpr(const node& a,const node& b)
{
return a.w < b.w;
}

inline long GCD(long a,long b)
{
while (b)
{
long tmp = b;
b = a%b;
a = tmp;
}
return a;
}

int main()
{
scanf("%ld%ld",&weight,&n);

scanf("%ld",card+1);
weight -= card[1];
long gg = card[1];
for (long i=2;i<n+1;i++)
{
scanf("%ld",card+i);
if (card[i])
{
gg = GCD(gg,card[i]);
weight -= card[i];
}
}
weight = -weight;
if (weight == 0)
{
printf("-1");//???
return 0;
}
gg = GCD(gg,weight);
for (long i=1;i<n+1;i++)
card[i] /= gg;
weight /= gg;

f[1][0] = 1;
for (long i=1;i<n+1;i++)
{
for (long j=0;j<weight+1;j++)
f[i+1][j] = 0;
for (long j=0;j<weight+1;j++)
{
if (j+card[i] < weight+1)
{
if (f[i+1][j+card[i]]+f[i][j] > 255)
f[i+1][j+card[i]] = 255;
else
f[i+1][j+card[i]] += f[i][j];
}
if (f[i+1][j] + f[i][j] > 255)
f[i+1][j] = 255;
else
f[i+1][j] += f[i][j];
}
}

if (f[n+1][weight] == 0)
printf("0");
else if (f[n+1][weight] > 1)
printf("-1");
else
{
long j = weight;
for (long i=n+1;i>1;i--)
{
if (f[i-1][j-card[i-1]])
{
ans[++top] = i-1;
j = j-card[i-1];
}
}
for (long i=top;i>0;i--)
printf("%ld ",ans[i]);
}
return 0;
}


#### 马云德国汉诺威展演讲--听写

2015-12-16 17:31:57

#### hdu 5510 -Bazinga（kmp)

2016-07-15 09:32:22

#### hdu 5510 Bazinga【KMP+暴力剪枝】

2016-09-28 18:35:06

#### 超级挑战

2007-04-06 18:43:00

#### solidworks快捷键

2013年09月02日 15KB 下载

#### 动态规划动态规划动态规划

2008年11月17日 1.07MB 下载

#### 算法合计之动态规划（高）

2010年08月11日 255KB 下载

#### URAL 1244. Gentlemen

2014-08-21 20:00:23

#### 计算机编程算法的动态规划问题

2010年04月28日 159KB 下载

#### 动态规划~动态规划32讲~

2011年06月13日 275KB 下载