Bitmasking and Dynamic Programming 实例 :Count ways to assign unique cap to every person

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<vector>
#include<sstream>  //stringstream
#include<string>
#include<bitset> 

using namespace std;

int main()
{
	//read
	int n;
	cin>>n;
	vector<vector<int>>capList(n);
	string temp, str; 
    int x; 
    getline(cin, str);  // to get rid of newline character 
    for (int i=0; i<n; i++) 
    { 
        getline(cin, str); 
        stringstream ss(str); 
  
        // while there are words in the streamobject ss 
        while (ss >> temp) 
        { 
            stringstream s; 
            s << temp; 
            s >> x; 
  
            // add the xth cap in the list of person if with id i 
            capList[i].push_back(x); 
        }
    }
    /// read end
	vector<bitset<100>>dp;
    dp.push_back(bitset<100>(0));
    for(int i = 1; i <= n; i++)
    {
    	vector<bitset<100>>cur;
    	for(int j = 0; j < capList[i-1].size(); j++)
    	{
    		for(int k = 0; k < dp.size(); k++)
    		{
    			bitset<100>preState = dp[k];
    			int cap = capList[i-1][j];
    			if(preState[cap]  == 0)
    			{
    				preState[cap] = 1;
    				cur.push_back(preState); 
    			}
    		} 
    	}
    	dp = cur;
    }
    cout<<dp.size();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值