BMHOJ 1439: 选择我自己的算法
看:数据多小!水题!
搜索一交:80pts
天哪,有毒吧!
那。。。就dp
令f[i][j]表示用了i个值为j可不可能达到
转移很简单
当然,滚动数组一开就好了
—》f[j]=1,则f[j+a[k]]=1,f[j*a[k]]=1;
std:
#include<bits/stdc++.h>
using namespace std;
#define maxn 5000000
const int N=25;
int n,m,W;
int a[N];
int t,cnt=0;
bool f[maxn+5],g[maxn+5];
int main(){
scanf("%d%d",&W,&n);
W++;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x<=9){
cnt++;
a[cnt]=x;
}
}
n=cnt;
scanf("%d",&m);
while(m--){
scanf("%d",&t);
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<=W;i++){
for(int j=0;j<=maxn;j++) g[j]=f[j];
for(int j=0;j<=maxn;j++){
if(!g[j]) continue;
for(int k=1;k<=n;k++){
if(j+a[k]<maxn) f[j+a[k]]=1;
if(j*a[k]<maxn) f[j*a[k]]=1;
}
}
}
//for(int i=0;i<=100;i++) cout << f[i] << " ";
if(f[t]) printf("Y\n");
else printf("N\n");
}
return 0;
}