hdu 4906 状压dp

题意:给出n,k<=20,L<=10^9 问能不能通过不大于L的数组成一个含n个数的序列使得能从这个序列中挑出几个数的和为k,求满足条件序列的个数

题解:看到k<20可以用sum的状态做状压dp的状态

状态转移方程next=(1<<(p-1))|j|((j<

#include
#include
#include
#include
#define ll __int64
using namespace std;
const ll mod=1e9+7;
ll dp[1<<21],v;
int main()
{
    int T,n,k,l,MIN,SIZE,i,j,p;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&k,&l);
        memset(dp,0,sizeof(dp));
        dp[0]=1;//赋初值不然没法启动
        SIZE=(1<=0;j--){//倒着枚举状态是类似背包一样防止重复加
                v=dp[j];
                if(v==0)continue;
                for(p=1;p<=MIN;p++){
                    int next=(1<<(p-1))|j|((j<




你可能感兴趣的:(ACM_DP)