vijos P1071

<问题分析>

设置一个状态数组表示到达这个重量的一张牌的序号,状态转移方程pos[i][j]=i {if(pos[i][j-v[i]]!=0)}

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     int tag,t,n,i,j,k,v[101];
 7     char pos[2][100001],pos1[101];
 8     scanf("%d",&t);
 9     scanf("%d",&n);
10     memset(pos[0],0,sizeof(char)*(t+1));
11     j=0;
12     for(i=1;i<=n;i++)
13     {
14        scanf("%d",&v[i]);
15        j+=v[i];
16     }
17     t=j-t;
18     tag=0;
19     pos[0][0]=1;
20     for(i=1;i<=n;i++)
21     {
22        for(j=0;j<=t;j++)
23        {
24           if(j-v[i]>=0)
25           {
26             if(pos[(i-1)%2][j-v[i]]!=0)
27             {
28                if(j==t)
29                {
30                  if(pos[(i-1)%2][t]==0)
31                    tag=1;
32                  else
33                    tag=-1; 
34                }
35                pos[i%2][j]=i;
36             }
37             else
38             {
39                pos[i%2][j]=pos[(i-1)%2][j]; 
40             } 
41           }
42           else
43           {
44               pos[i%2][j]=pos[(i-1)%2][j]; 
45           }
46        } 
47     }
48     if(tag!=1)
49     {
50       printf("%d
",tag);
51       while(true);
52       return 0;
53     }
54     i=0;j=t;
55     while(true)
56     {
57        if(j==0) break;
58        pos1[i++]=pos[n%2][j];
59        j-=v[pos[n%2][j]];
60     }
61     for(j=i-1;j>0;j--)
62       printf("%d ",int(pos1[j]));
63     printf("%d
",int(pos1[0]));
64     while(true);
65     return 0;
66 }
原文地址:https://www.cnblogs.com/simplesslife/p/PlayCards.html