假设一组输入
1500 7
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 0
400 4 0
转化显示为
500 400 300 400 200 500 400
那么如果选择是1不选择是0,那么一个选择就是一个01串
而这个串可以用一个整数的二进制来表达
从00000000,到11111111,基本就是所有选择了,(此处可用unsigned long int,题目提示不大于60个商品)
然后我的循环取从1到2的7次方-1即可,我就可以遍历所有的组合
在判断某一具体商品时,我通过判断他的主件是否已选择来决定是否跳过一个无效组合
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<limits.h> int main(){ int sum=0,ttal=0; double max=0; int matrix[64][3]; scanf("%i %i",&sum,&ttal); int i=0; while(scanf("%i %i %i",&matrix[i][0],&matrix[i][1],&matrix[i][2]) != EOF){ i++; } max=exp2(ttal); int chosn=1,mchosn=1,mPrtIdx=0,tryWei=0,bestWei=0,trySum=0,bestCom,invalid=0; long unsigned int bestComb=0,comb=0;int j=0,k=0; for(comb=1;comb<floor(max);comb++){//all combination in binary bits chosn=1,mchosn=1; tryWei=0,trySum=0,invalid=1; for(j=0,k=0;j<ttal;j++){//count sum of a spec comb k=ttal-j-1; chosn=(comb>>j)&1; if(chosn){//then check main part mPrtIdx=matrix[k][2];//main part index if(mPrtIdx!=0){ mchosn=(comb>>(ttal-mPrtIdx))&1;//whether main part chosen } if(mchosn){ trySum+=matrix[k][0]; if(trySum>sum){ break;//out of range }else{ tryWei+=matrix[k][0]*matrix[k][1]; } }else{ break;//mainpart not choosed,try next comb } }else{ continue;//not chosen } }//For end -cur comb if(j==ttal)invalid=1; if (invalid && tryWei>bestWei){ bestWei=tryWei; bestComb=comb; } }//For end -all comb printf("%i",bestWei); return 0; }