[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;
}
//求將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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.