6 solutions
-
5
#include<bits/stdc++.h> using namespace std; const int N=25; int w[N],ans=-1,n,m; void dfs(int u,int s) { if(u==n+1) { if(s<=m)ans=max(ans,s); return; } dfs(u+1,s); dfs(u+1,s+w[u]); } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&w[i]); dfs(1,0); printf("%d",ans); return 0; } -
3
#include<bits/stdc++.h> using namespace std; const int N=25; int w[N],ans=-1,n,m; void dfs(int u,int s) { if(u==n+1) { if(s<=m)ans=max(ans,s); return; } dfs(u+1,s); dfs(u+1,s+w[u]); } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&w[i]); dfs(1,0); printf("%d",ans); return 0; } -
2
#include<bits/stdc++.h> using namespace std; const int N=25; int w[N]; int main() { int n,m; cin>>n>>m; for(int i=0;i<n;i++) { cin>>w[i]; } int res=0; for(int i=0;i<1<<n;i++) { bitset<32> a(i); //将i转换成二进制存到a里面 int money=0; for(int j=0;j<n;j++) { if(a[j]==1) //选了 { money+=w[j]; } } if(money<=m) { res=max(res,money); } } cout<<res; return 0; } -
1
枚举子集写法:
#include<bits/stdc++.h> using namespace std; const int N=25; int v[N]; int main(){ int n,V; cin>>n>>V; for(int i=0;i<n;i++){ cin>>v[i]; } int res=0; for(int i=1;i<1<<n;i++){ int s=0; for(int j=0;j<n;j++){ if(i>>j&1){ s+=v[j]; } } if(s<=V){ res=max(res,s); } } cout<<res; return 0; } -
-4
-
-5
好吧,我再来一次。
#include<bits/stdc++.h> using namespace std; const int N=25; int w[N],ans=-1,n,m; void dfs(int u,int s) { if(u==n+1) { if(s<=m)ans=max(ans,s); return ; } dfs(u+1,s); dfs(u+1,s+w[u]); } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&w[i]); dfs(1,0); printf("%d",ans); return 0; }
- 1
Information
- ID
- 229
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 79
- Accepted
- 22
- Uploaded By