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


京公网安备 11010502036488号