rt,两份代码一份70 WA#1#6#7,一份100,AC的我把dp[i<<i]的部分放到里面一起计算了,WA的提前进行了预处理,感觉没有什么区别啊。
AC代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define mod 1000000007
#define ll long long
using namespace std;
int num[30];
int dp[(1<<24)];
int val[(1<<24)];
int main(){
int n,a=0,b=0,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>val[(1<<(i-1))];
cin>>m;
if(m==1) cin>>a;
else if(m==2) cin>>a>>b;
dp[0]=1;
for(int i=0;i<(1<<n);i++){
if(i==0) continue;
int tmp=i,x,flag=0;
while(tmp){
x=(tmp&(-tmp));
if(!flag){
val[i]=val[i-x]+val[x];
if(val[i]==a || val[i]==b) break;
flag^=1;
}
dp[i]=(dp[i]+dp[i-x])%mod;
tmp-=x;
}
}
cout<<dp[(1<<n)-1];
}
WA代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define mod 1000000007
#define ll long long
using namespace std;
int num[30];
int dp[(1<<24)];
int val[(1<<24)];
int main(){
int n,a=0,b=0,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>num[i];
cin>>m;
if(m==1) cin>>a;
else if(m==2) cin>>a>>b;
for(int i=0;i<n;i++){
if((1<<i)!=a && (1<<i)!=b) dp[(1<<i)]=1;
val[(1<<i)]=num[i+1];
}
for(int i=0;i<(1<<n);i++){
if(i==0 || i-(i&(-i))==0) continue;
int tmp=i,x,flag=0;
while(tmp){
x=(tmp&(-tmp));
if(!flag){
val[i]=val[i-x]+val[x];
if(val[i]==a || val[i]==b) break;
flag^=1;
}
dp[i]=(dp[i]+dp[i-x])%mod;
tmp-=x;
}
}
cout<<dp[(1<<n)-1];
}