hdu5890

来源:互联网 发布:淘宝网拖鞋带后跟 编辑:程序博客网 时间:2024/04/28 20:09

当成模板:n个数取k个数能不能组成和为x,加入限制条件不能取x,y,z位置上的数

大致题意:有一堆数,一次去掉至少3个数,再从剩余数中取10个如果和能组成87输出Yes

测试案例:

input:

1121 2 3 4 5 6 7 8 9 42 21 22101 2 33 4 52 3 210 10 1010 11 1110 1 11 2 101 11 121 10 1011 11 12



output:

NoNoNoYesNoYesNoNoYesYes


解题思路:我就当模板用

代码:

代码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");        }    }}



0 0
原创粉丝点击