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\n",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\n",int(pos1[0]));
64     while(true);
65     return 0;
66 }

 

 

转载于:https://www.cnblogs.com/simplesslife/p/PlayCards.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值