[01背包]求将N重果汁填满杯子时,在保证营养最全的情况下所用的最小价格

来源:互联网 发布:python dateutil 安装 编辑:程序博客网 时间:2024/04/19 16:26
//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;
}
0 0