URAL1244. Gentlemen(背包)
以前做的题 VJ太水了 数组里面的数可能会小于0 当时没判断
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }