首页 > 代码库 > URAL 1244. Gentlemen (DP)

URAL 1244. Gentlemen (DP)

题目链接

题意 : 给出一幅不完全的纸牌.算出哪些牌丢失了.

思路 : 算是背包一个吧。if f[j]>0  f[j+a[i]] += f[j];然后在记录一下路径。

 1 //1244
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <iostream>
 5 
 6 using namespace std ;
 7 
 8 int a[1100000] ,b[1010000];
 9 int dp[1010000] ;
10 
11 int main()
12 {
13     int w ;
14     while(~scanf("%d",&w))
15     {
16         int N ;
17         scanf("%d",&N) ;
18         for(int i = 1 ; i <= N ; i++)
19             scanf("%d",&a[i]) ;
20         memset(dp,0,sizeof(dp)) ;
21         memset(b,0,sizeof(b)) ;
22         dp[0] = 1 ;
23         for(int i = 1 ; i <= N ; i++)
24         {
25             for(int j = w ; j >= 0 ; j--)
26             {
27                 if(dp[j] > 0 && (j+a[i] <= w))
28                 {
29                     dp[j+a[i]] += dp[j] ;
30                     if(b[j+a[i]] <= 0)
31                         b[j+a[i]] = i;
32                 }
33             }
34         }
35         if(dp[w] == 0)
36             printf("0\n") ;
37         else if(dp[w] > 1)
38             printf("-1\n") ;
39         else
40         {
41             int c[110000] ;
42             memset(c,0,sizeof(c)) ;
43             for(int i = N ; i >= 1 ; i--)
44             {
45                 if(b[w] == i)
46                 {
47                     c[i] = true ;
48                     w -= a[i] ;
49                 }
50             }
51             for(int i = 1 ; i <= N; i++)
52                 if(c[i] == 0)
53                     printf("%d ",i) ;
54             printf("\n") ;
55         }
56     }
57     return 0 ;
58 }
View Code