0/1枚举问题
假设有n个杯子,每个杯子里都装有不同的数量的钱,你可以任意的选择其中的任意数量个杯子带走,请问你有多少种不同收获结果?
思路
每一个杯子都有选择或者不选择两种状态,在不考虑复杂度的情况下,可以进行2^n次枚举,获取每一种情况下的结果!
那么如何实现对2^n中情况下的枚举呢????
考虑,对于数 0 ~2^n-1,任意两个不同的数的二进制表示都是不同的,他们每一位的0或1可以表示为该编号的水杯被选择或不被选择,而且要表示2^n-1恰好需要n位!
for(int i =0; i<(1<<n); i++) //将1左移n位,其值为2^n
{
int cot =0; //初始金钱
for( int j =0; j<n; i++)
{
if(i&(1<<j)) // 在当前的情况下,第j个杯子是否被选中呢?即i的第j位是不是1?
cot+= val[j];
}
cout<< i <<":"<<cot<<endl; //输出第i种情况下的值
}