[01揹包]求將N重果汁填滿杯子時,在保證營養最全的情況下所用的最小价格

//01揹包問題
//求將N重果汁填滿杯子時,在保證營養最全的情況下所用的最小价格
#include <stdio.h>


//XXL
int MAX=1000000000;         
int w[500],p[500]; //w[i],p[i]表示i果汁的重量和價格
int cost[10000]; //保存指定重量的最小cost(即最小price)


int main(void)
{
int tc, T;

//XXL
int i,j,E,F; // E,F分別爲空杯和滿杯時的重量
int WL; //weight limit, 杯中允許放入的最大重量
int N;  //每個case裏juice的種數


scanf("%d", &T);
for(tc = 0; tc < T; tc++)
{

//XXL
scanf("%d%d",&E,&F); 
        WL = F-E; 
        scanf("%d",&N); 
        for(i=0;i<N;i++)
{
scanf("%d%d",&p[i],&w[i]); 
}
cost[0]= 0; //重要初始化
        for(i=1;i<=WL;i++) 
{
cost[i]=MAX; //初始化cost[]
}
        for(i=0;i<N;i++)  //每種juice

            for(j=w[i];j<=WL; j++) //由小往大(杯的最大重量)推算

//指定重量的最小cost爲下兩種情況下的最小者:
//1)放入第i種juice
//2) 不放入第i種juice
if(cost[j] > cost[j-w[i]]+p[i]) //與不放第i種juice的情況相比,當前重量的cost依賴於與(之前不放第i種juice的最小cost)的比較結果。
{
cost[j]= cost[j-w[i]]+p[i];
}
            } 
        } 
        if(cost[WL]!=MAX) //如果杯中的weight到達最大,此時營養最全,這是最優解
{
            printf("%d\n",cost[WL]); 
}
else
{
printf("impossible\n");
}
        

}


return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章