首先观察题目,n表示输入数据的个数,s表示物品个数,m表示背包容重量,v表示物品单位重量的价值,w表示单个物品的总重量,物品可以分割,并且每个物品只可以拿一次,要求输出在满足包容重量的前提下包内物品价值和的最大值
分析:定义一个表示物品的结构体,属性有单位价值和重量,将每个物品按照单位价值来进行排序,要满足价值和最大的条件的话,那我们的背包就要先从单位价值最大的开始装起,直到背包满
代码如下:
1 #include<stdio.h> 2 struct articles 3 { 4 int v; 5 int w; 6 }f[11]; 7 int main() 8 { 9 int i,j,s,m,n,sum; 10 struct articles t; 11 scanf("%d",&n); 12 while(n--) 13 { 14 sum=0; 15 scanf("%d %d",&s,&m); 16 for(i=0;i<s;i++) 17 { 18 scanf("%d %d",&f[i].v,&f[i].w); 19 } 20 for(i=0;i<s;i++) 21 { 22 for(j=i+1;j<s;j++) 23 { 24 if(f[j].v>f[i].v) 25 { 26 t=f[j]; 27 f[j]=f[i]; 28 f[i]=t; 29 } 30 } 31 }//冒泡排序,按单价降序 32 for(i=0;i<s;i++) 33 { 34 if(m>=f[i].w) 35 { 36 sum=sum+f[i].v*f[i].w; 37 m=m-f[i].w; 38 }else 39 { 40 sum=sum+f[i].v*m 41 m=0; 42 break; 43 } 44 } 45 printf("%d ",sum); 46 } 47 return 0; 48 }