糖果--状压dp--用二进制求满足种类的最小包数

二进制求满足种类的最小包数

集合式(表示每一个元素是否在集合中)

1.用<<右移标记如有第2种表示为010,就是1<<(2-1);

#include
using namespace std;
#define N 100011
typedef long long ll;
typedef pair PII;
int t[110];
int n,m,k;
int dp[10000009];///2的20次方大小,因为m<=20
int main()
{ 
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
	for(int j=1;j<=k;j++)
	{
		int x;cin>>x;
		t[i]|=(1<<(x-1));///1<<(x-1) x=2,就是1*2的1次方,即010,
						 ///原来为001或 010变011,1表示有这个 
	}
}
memset(dp,0x3f3f3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
	dp[t[i]]=1;///有的初始化为1 
}
for(int i=1;i<=n;i++)
{
	for(int j=0;j<=(1<n) cout<<-1;///满了但不是n包以内肯定就是缺了凑不齐
 else cout<

你可能感兴趣的:(算法,数据结构)