I think dynamic approach depend on B and number elements of A.
在这种情况下,我建议采用动态方法,使用 A <= 1.000.000 的 B*number 元素
Use call F[i,j] is true if use can use from A[1] to A[j] to build i and false otherwise
因此,您必须选择的每一步:
使用 a[j] 然后 F[i,j]=F[ia[j],j-1]
不要用户 a[j] 然后 F[i,j] = F[i,j-1]
然后,如果存在 F[B,*]=1 ,则可以构建 B。
下面是示例代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int f[1000][1000], a[1000], B,n;
// f[i][j] = 1 => can build i when using A[1]..a[j], 0 otherwisw
int tmax(int a, int b){
if (a>b) return a;
return b;
}
void DP(){
f[0][0] = 1;
for (int i=1;i<=B;i++)
for (int j=1;j<=n;j++)
{
f[i][j] = f[i][j-1];
if (a[j]<=i)
f[i][j] = tmax(f[i-a[j]][j-1], f[i][j]);
}
}
int main(){
cin >> n >> B;
for (int i=1;i<=n;i++) cin >>a[i];
DP();
bool ok = false;
for (int i=1;i<=n;i++){
if (f[B][i]==1) {
cout<<"YES";
ok = true;
break;
}
}
if (!ok) cout <<"NO";
}