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

 

你可能感兴趣的:(em)