#include <stdio.h>
int main(){
//二等奖(以下称为B商品)的价格是C商品的 1.5 倍,一等奖(以下称为A商品)是C商品的 2 倍
//3 6 4 3 1 2 3 23 6
int a=0,b=0,c=0,m,n,ajs=0,bjs=0,w=1;
scanf("%d%d",&m,&n);
for(ajs=1;ajs<n;ajs++){
for(bjs=1;bjs<n;bjs++){
for(;ajs*a+bjs*b+(n-ajs-bjs)*c<m;c++){
a=2*c;
b=3*c/2;
if(ajs*a+bjs*b+(n-ajs-bjs)*c==m&&ajs<bjs&&bjs<n-ajs-bjs)
{
printf("Price=%d, A=%d, B=%d, C=%d\n",c,ajs,bjs,n-ajs-bjs);
break;w=0;
}
}
c=0;a=0;b=0;
if(w==0)break;
}
if(w==0)break;
}
return 0;
}
本题太坑了,商品件数至少一件,并不知道,所以ajs bjs 必须从1开始循环,不能是0。
另外,注意最内侧件数的循环判断,ajs*a+bjs*b+(n-ajs-bjs)*c<m,第一次进入需要给a b初始化,因为a=2*c; b=3*c/2; 并没有执行。
#include<stdio.h>
int main()
{int M,N,count=0;
int na,nb,nc,pa,pb,pc;
scanf("%d %d",&M,&N);
for(pc=1;;pc++){
for(na=1;na<N;na++){
for(nb=1;nb<N-na;nb++){nc=N-nb-na;
if(nb>na&&nc>nb&&nc*pc+pc*3/2*nb+na*2*pc==M){
count=1;
break;
}
if(count==1)break;
}
if(count==1)break;
}
if(count==1)break;
}
printf("Price=%d, A=%d, B=%d, C=%d\n",pc,na,nb,nc);
return 0;
}
这是室友的思路更清晰的代码,如果把c价格放在最外层循环,一直循环到价格被找到(题目已知一定存在),就能减少许多冗余。