时间限制: 1 Sec 内存限制: 128 MB
提示
显然我们可以选取的方案有
编号为1、3的物品。
编号为1、2、6的物品。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
ll a[30],sum=0,m,ans,s;
int vis[30],n,flag=0;
map<ll,int>p;
/*bool dfs(int i,ll sum)
{
if(i==n) {
if(sum==m||s-sum==m) return true;
else return false;
}
if(dfs(i+1,sum)) return true;
if(dfs(i+1,sum+a[i])) return true;
return false;
}*/
void dfs(int x,ll sum)
{
if(sum==m)
{
flag=1; return ;
}
if(x==n/2)
{
p[sum]=1; return ;
}
dfs(x+1,sum+a[x]);
dfs(x+1,sum);
}
void dfs2(int x,ll sum)
{
if(sum==m){
flag=1; return ;
}
if(p[m-sum]){
flag=1; return ;
}
if(x==n) return ;
dfs2(x+1,sum+a[x]);
dfs2(x+1,sum);
}
int main()
{
scanf("%d %lld",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
s+=a[i];
}
dfs(0,0);
if(flag) printf("YES\n");
else{
dfs2(n/2,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll n,s,sum,a[37];
bool t=false;
void dfs(int x){
if(sum==s){
t=true;
/*cout<<"YES"<<endl;
exit(0);*/
return ;
}
if(sum>s)return ;
if(x>n)return ;
sum+=a[x];
dfs(x+1);
sum-=a[x];
dfs(x+1);
return ;
}
int main(){
cin>>n>>s;
ll ans=0;
for(int i=0;i<n;i++){
cin>>a[i];
ans+=a[i];
}
if(ans<s){
cout<<"NO"<<'\n';
return 0;
}else if(ans==s){
cout<<"YES"<<'\n';
return 0;
}
sort(a,a+n);
dfs(0);
if(!t)cout<<"NO"<<'\n';
else{
cout<<"YES"<<'\n';
}
return 0;
}