当成模板:n个数取k个数能不能组成和为x,加入限制条件不能取x,y,z位置上的数
大致题意:有一堆数,一次去掉至少3个数,再从剩余数中取10个如果和能组成87输出Yes
测试案例:
input:
1 12 1 2 3 4 5 6 7 8 9 42 21 22 10 1 2 3 3 4 5 2 3 2 10 10 10 10 11 11 10 1 1 1 2 10 1 11 12 1 10 10 11 11 12
output:
No No No Yes No Yes No No Yes Yes
解题思路:我就当模板用
代码:
代码1:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <bitset>
using namespace std;
typedef long long ll;
int n;
int a[100];
bool check[52][52][52];
bitset<90> dp[11];
void solve(int x,int y,int z)
{
for (int i=0;i<=10;i++)
dp[i].reset();
dp[0][0]=1;
for (int i=1;i<=n;i++)
{
if (i==x||i==y||i==z||a[i]>87)
continue;
for (int v=10;v>0;v--)
{
dp[v]=dp[v]|(dp[v-1]<<a[i]);
}
}
if (dp[10][87]==1)
check[x][y][z]=true;
}
int main()
{
int t,i,j,k,q,s[3];
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for (i=1;i<=n;i++)
{
for (j=i;j<=n;j++)
{
for (k=j;k<=n;k++)
{
check[i][j][k]=false;
solve(i,j,k);
}
}
}
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d",&s[0],&s[1],&s[2]);
sort(s,s+3);
if (check[s[0]][s[1]][s[2]])
{
printf("Yes\n");
}
else
printf("No\n");
}
}
}