<问题分析>
设置一个状态数组表示到达这个重量的一张牌的序号,状态转移方程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 }