思路分析:
这是一道简单的贪心问题,由于物品可以分割,只需给每一个物品的价值进行排序(你可以用sort函数排序,也可以用冒泡进行排序),如果物品的重量小于背包的重量,总价值sum等于该物品的价值v与重量w的乘积,背包容量m变为m-该物品的重量w,当物品的重量大于背包容量时,总价值sum等于该物品的价值v与背包重量m的乘积.
代码参考:
使用冒泡排序的代码
#include<stdio.h> typedef struct shu{ int v; int w; }shu; int main() { shu shu[100]; int n; scanf("%d",&n); while(n--) { int s,m; scanf("%d%d",&s,&m); int i,j,k,sum=0,t; for(i=0;i<s;i++) { scanf("%d%d",&shu[i].v ,&shu[i].w ); } for(i=0;i<s;i++) { for(j=0;j<s-1-i;j++) { if(shu[j].v <shu[j+1].v ) { t=shu[j].v ; shu[j].v =shu[j+1].v ; shu[j+1].v =t; k=shu[j].w ; shu[j].w =shu[j+1].w ; shu[j+1].w =k; } } } for(i=0;i<s;i++) { if(shu[i].w <m) { sum+=shu[i].v *shu[i].w ; m=m-shu[i].w ; } else { sum+=shu[i].v *m; break; } } printf("%d\n",sum); } return 0; } 使用sort函数的代码 #include<stdio.h> #include<algorithm> using namespace std; typedef struct shu{ int v; int w; }shu; bool cmp(shu a,shu b) { return a.v>b.v; } int main() { shu shu[100]; int n; scanf("%d",&n); while(n--) { int s,m; scanf("%d%d",&s,&m); int i,j,k,sum=0,t; for(i=0;i<s;i++) { scanf("%d%d",&shu[i].v ,&shu[i].w ); } sort(shu,shu+s,cmp); for(i=0;i<s;i++) { if(shu[i].w <m) { sum+=shu[i].v *shu[i].w ; m=m-shu[i].w ; } else { sum+=shu[i].v *m; break; } } printf("%d\n",sum); } return 0; }