假设一组输入
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;
}