#include <stdio.h>
#include <malloc.h>
#include <windows.h>typedef struct goods
{
double *value; //ä»·å¼
double *weight; //éé
char *select; //æ¯å¦éä¸å°æ¹æ¡
int num;//ç©åæ°é
double limitw; //éå¶éé
}GOODS;
double maxvalue,totalvalue;//æ¹æ¡æ大价å¼,ç©åæ»ä»·å¼
char *select1; //临æ¶æ°ç»
void backpack(GOODS *g, int i, double tw, double tv)//åæ°ä¸ºç©åi,å½åéæ©å·²ç»è¾¾å°çééåtw,æ¬æ¹æ¡å¯è½è¾¾å°çæ»ä»·å¼
{
int k;
if (tw + g->weight[i] <= g->limitw)//å°ç©åiå
å«å¨å½åæ¹æ¡,ä¸ééå°äºçäºéå¶éé
{
select1[i] = 1; //éä¸ç¬¬i个ç©å
if (i < g->num - 1) //è¥ç©åiä¸æ¯æåä¸ä¸ªç©å
backpack(g, i + 1, tw + g->weight[i], tv); //éå½è°ç¨,继ç»æ·»å ä¸ä¸ç©å
else //è¥å·²å°æåä¸ä¸ªç©å
{
for (k = 0; k < g->num; ++k) //å°ç¶ææ å¿å¤å¶å°optionæ°ç»ä¸
g->select[k] = select1[k];
maxvalue = tv; //ä¿åå½åæ¹æ¡çæ大价å¼
}
}
select1[i] = 0; //åæ¶ç©åiçéæ©ç¶æ
if (tv - g->value[i] > maxvalue)//è¥ç©åæ»ä»·å¼åå»ç©åiçä»·å¼è¿å¤§äºmaxvæ¹æ¡ä¸å·²æçä»·å¼,说æè¿å¯ä»¥ç»§ç»åæ¹æ¡ä¸æ·»å ç©å
{
if (i < g->num - 1) //è¥ç©åiä¸æ¯æåä¸ä¸ªç©å
backpack(g, i + 1, tw, tv - g->value[i]); //éå½è°ç¨,继ç»å å
¥ä¸ä¸ç©å
else //è¥å·²å°æåä¸ä¸ªç©å
{
for (k = 0; k < g->num; ++k) //å°ç¶ææ å¿å¤å¶å°optionæ°ç»ä¸
g->select[k] = select1[k];
maxvalue = tv - g->value[i]; //ä¿åå½åæ¹æ¡çæ大价å¼(ä»ç©åæ»ä»·å¼ä¸åå»ç©åiçä»·å¼)
}
}
}
int main()
{
double sumweight;
GOODS g;
int i;
printf("èå
æ大éé:");
scanf("%lf",&g.limitw);
printf("å¯éç©åæ°é:");
scanf("%d",&g.num);
if(!(g.value = (double *)malloc(sizeof(double)*g.num)))//åé
å
åä¿åç©åä»·å¼
{
printf("å
ååé
失败\n");
exit(0);
}
if(!(g.weight = (double *)malloc(sizeof(double)*g.num)))//åé
å
åä¿åç©åçéé
{
printf("å
ååé
失败\n");
exit(0);
}
if(!(g.select = (char *)malloc(sizeof(char)*g.num)))//åé
å
åä¿åç©åçéé
{
printf("å
ååé
失败\n");
exit(0);
}
if(!(select1 = (char *)malloc(sizeof(char)*g.num)))//åé
å
åä¿åç©åçéé
{
printf("å
ååé
失败\n");
exit(0);
}
totalvalue=0;
for (i = 0; i < g.num; i++)
{
printf("è¾å
¥ç¬¬%då·ç©åçééåä»·å¼:",i + 1);
scanf("%lf%lf",&g.weight[i],&g.value[i]);
totalvalue+=g.value[i];//ç»è®¡ææç©åçä»·å¼æ»å
}
printf("\nèå
æ大è½è£
çéé为:%.2f\n\n",g.limitw);
for (i = 0; i < g.num; i++)
printf("第%då·ç©åé:%.2f,ä»·å¼:%.2f\n", i + 1, g.weight[i], g.value[i]);
for (i = 0; i < g.num; i++)//åå§è®¾åç©åé½æ²¡å å
¥éæ©é
select1[i]=0;
maxvalue=0;//å å
¥æ¹æ¡ç©åçæ»ä»·å¼
backpack(&g,0,0.0,totalvalue); //第0å·ç©åå å
¥æ¹æ¡,æ»éé为0,ææç©åä»·å¼ä¸ºtotalvalue
sumweight=0;
printf("\nå¯å°ä»¥ä¸ç©åè£
å
¥èå
,使èå
è£
çç©åä»·å¼æ大:\n");
for (i = 0; i < g.num; ++i)
if (g.select[i])
{
printf("第%då·ç©å,éé:%.2f,ä»·å¼:%.2f\n", i + 1, g.weight[i], g.value[i]);
sumweight+=g.weight[i];
}
printf("\næ»éé为: %.2f,æ»ä»·å¼ä¸º:%.2f\n", sumweight, maxvalue );
// getch();
return 0;
}
温馨提示:答案为网友推荐,仅供参考