51nod 1354 选数字 (01背包变形)

dp5级题,是一个背包的变形题,我想把它放在五级题的原因就是很难想到这只是一个背包题吧。用map处理一下,和离散化的作用是一样的。只是用了系统自带的函数库而已。

#include 
#define ll long long
using namespace std;
const int maxn=1010,mod=1e9+7;
int a[maxn];
maptemp1,temp2;
map::iterator it;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
    int n,k,x,cnt=0;
    temp1.clear();
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
       {scanf("%d",&x);if(k%x==0)a[++cnt]=x;}
        for(int i=1;i<=cnt;i++)
        {
            temp2=temp1;
            for(it=temp2.begin();it!=temp2.end();it++)
            {
                int tmp=it->first*a[i];
        if(k%tmp==0)temp1[tmp]=(it->second+temp1[tmp])%mod;
            }
            temp1[a[i]]= (temp1[a[i]]+1)%mod;
        }
        printf("%d\n",temp1[k]);
}
    return 0;
}


你可能感兴趣的:(ACM-dp,51nod)