ZOJ 3631 Watashi's BG DFS
思路:
本来是一个背包问题,背包容量太大,就T了
于是就只有DFS然后搜索,注意剪枝
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define mp(x,y) make_pair(x,y) 6 const int INF = 0x3f3f3f3f; 7 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 8 inline ll read(){ 9 ll x=0,f=1;char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 11 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 12 return x*f; 13 } 14 ////////////////////////////////////////////////////////////////////////// 15 const int maxn = 1e5+10; 16 17 int n,M,cost[35]; 18 int ans; 19 20 bool cmp(int x,int y){ 21 return x > y; 22 } 23 24 void dfs(int tot,int s){ 25 if(ans == M) return ; 26 if(s > M) return ; 27 if(tot>n){ 28 ans = max(s,ans); 29 return ; 30 } 31 32 int sum = s; 33 for(int i=tot; i<=n; i++) 34 sum += cost[i]; 35 if(sum < ans) return ; 36 37 dfs(tot+1,s+cost[tot]); 38 dfs(tot+1,s); 39 } 40 41 int main(){ 42 while(scanf("%d%d",&n,&M)==2){ 43 ans = 0; 44 for(int i=1; i<=n; i++) 45 cost[i] = read(); 46 sort(cost+1,cost+1+n,cmp); 47 48 dfs(0,0); 49 cout << ans << endl; 50 } 51 52 return 0; 53 }
代码二:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define mp(x,y) make_pair(x,y) 6 const int INF = 0x3f3f3f3f; 7 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 8 inline ll read(){ 9 ll x=0,f=1;char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 11 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 12 return x*f; 13 } 14 ////////////////////////////////////////////////////////////////////////// 15 const int maxn = 1e5+10; 16 17 int n,M,cost[35],vis[35]; 18 int ans; 19 20 bool cmp(int x,int y){ 21 return x > y; 22 } 23 24 void dfs(int tot,int v){ 25 if(ans == M) return ; 26 if(v > M) return ; 27 if(v == M){ 28 ans = v; 29 return ; 30 } 31 int sum=v; 32 for(int j=tot+1;j<=n;j++){ 33 if(!vis[j]) 34 sum+=cost[j]; 35 } 36 if(sum <= ans) return; 37 ans=max(ans,v); 38 39 for(int j=tot+1;j<=n;j++) 40 { 41 if(vis[j]) 42 continue; 43 vis[j]=1; 44 dfs(j,v+cost[j]); 45 vis[j]=0; 46 } 47 } 48 49 int main(){ 50 while(scanf("%d%d",&n,&M)==2){ 51 mem(vis); 52 ans = 0; 53 for(int i=1; i<=n; i++) 54 cost[i] = read(); 55 sort(cost+1,cost+1+n,cmp); 56 57 for(int i=1;i<=n;i++){ 58 vis[i]=1; 59 dfs(i,cost[i]); 60 vis[i]=0; 61 } 62 cout << ans << endl; 63 } 64 65 return 0; 66 }