URAL1244. Gentlemen(背包)

链接

以前做的题 VJ太水了 数组里面的数可能会小于0 当时没判断

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 int dp[100010],w[110],path[110],o,f[110],n,ff[110];
 8 int flag,tw;
 9 void dfs(int sw,int v,int u)
10 {
11     int j,i;
12     if(flag) return ;
13     path[v] = u;
14     if(sw==0)
15     {
16         flag  =1;
17         for(i = 1; i <= v ; i++)
18         ff[path[i]] = 1;
19         return ;
20     }
21     if(sw<0) return ;
22     for(j = 1; j <= n ; j++)
23     {
24         if(sw-w[j]<0)
25         continue;
26         if(!f[j]&&dp[sw-w[j]])
27         {
28             f[j] = 1;
29             dfs(sw-w[j],v+1,j);
30             f[j] = 0;
31         }
32     }
33 }
34 int main()
35 {
36     int i,j;
37     cin>>tw;
38     cin>>n;
39     for(i = 1; i <= n ; i++)
40     cin>>w[i];
41     dp[0] = 1;
42     for(i = 1 ; i <= n ;i++)
43         for(j = tw ; j>=w[i] ; j--)
44         {
45             dp[j] += dp[j-w[i]];
46         }
47     int sw = tw;
48     if(dp[tw]==0)
49     cout<<"0\n";
50     else if(dp[tw]>1)
51     cout<<"-1\n"<<endl;
52     else
53     {
54         for(i = 1; i <= n ; i++)
55         {
56             if(sw-w[i]<0)
57             continue;
58             if(dp[sw-w[i]])
59             {
60                 f[i] = 1;
61                 dfs(sw-w[i],1,i);
62                 f[i] = 0;
63             }
64             if(flag) break;
65         }
66         int kk=0;
67         for(i = 1; i <= n ; i++)
68         {
69             if(!ff[i])
70             {
71                 if(kk)
72                 printf(" ");
73                 printf("%d",i);
74                 kk++;
75             }
76         }
77         puts("");
78     }
79     return 0;
80 }
View Code

 

posted @ 2013-09-10 11:45  _雨  阅读(207)  评论(0编辑  收藏  举报