首先思路是第一篇题解的思路,先给出第一篇题解的完整代码:
#include <cstdio>
const int N=24;
const int mod=1e9+7;
int n,m,b1,b2,dis[1<<N],f[1<<N];
void upd(int &x,int y) {(x+=y)>=mod&&(x-=mod);}
void solve(int x) {
for(int i=x,j;i;i^=j) j=i&-i,upd(f[x],f[x^j]);
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%d",&dis[1<<i]);
scanf("%d",&m);
if(m>0) scanf("%d",&b1);
if(m>1) scanf("%d",&b2);
f[0]=1;
int msk=(1<<n)-1;
for(int i=1;i<=msk;++i) {
int j=i&-i;
dis[i]=dis[i^j]+dis[j];
if(dis[i]==b1||dis[i]==b2) continue;
solve(i);
}
printf("%d\n",f[msk]);
return 0;
}
然后,我按照这个思路写了一份代码,编译器一直报错,我的代码:
#include<iostream>
#define lowbit(x) (x&(-(x)))
using namespace std;
const int N=20,mod=1e9+7;
long long dp[1<<N],dis[1<<N];
int n,m,a[N],b[N];/*
以下注释掉的是我自己写的
inline void cal(int &x,int y) { (x+=y)>=mod&&(x-=mod); }
inline void solve(int x) { for(int i=x,j;i;i^=j) j=lowbit(i), cal(dp[x],dp[x^j]); }*/
void upd(int &x,int y) {(x+=y)>=mod&&(x-=mod);}
void solve(int x) {
for(int i=x,j;i;i^=j) j=i&-i,upd(dp[x],dp[x^j]);
}
//这个是题解的函数,但是一样没有过编译器,照样报错。
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>dis[1<<i-1];
cin>>m;
for(int i=1;i<=m;i++) cin>>b[i];
dp[0]=1;
int all=(1<<n)-1;
for(int i=1;i<=all;i++)
{
int j=lowbit(i);
dis[i]=dis[j]+dis[i^j];
if(dis[i]==b[1] || dis[i]==b[2]) continue;
solve(i);
}
return 0;
}
//先不说我的思路或者写的对不对,现在是编译器的问题
提供一下报错的信息:
11 42 [Error] cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'.
大概就是说,当调用cal或solve函数时,如果传入的是临时计算结果或字面量(如cal(1,2)),就会触发这个错误 2 右值(如1、a+b的结果)不能绑定到非const左值引用int&上
9 15 [Note] initializing argument 1 of 'void upd(int&, int)'
到底什么原因啊QWQ,查了资料也找不出来哪里有问题。。。