C语言(19)背包问题

来源:互联网 发布:千县万村农村淘宝计划 编辑:程序博客网 时间:2024/06/01 16:20
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
13 155 102 83 9
样例输出
65
#include <stdio.h>int main(void){int n, s, m, i, j, k, sum, buf[10][2]={{0}};scanf("%d", &n);while(n--){scanf("%d%d", &s, &m);for(i=0; i<s; i++){scanf("%d%d", &buf[i][0], &buf[i][1]);}/*排序大到小*/for(i=0; i<s; i++){k=i;for(j=i+1; j<s; j++){if(buf[k][0] < buf[j][0]){k=j;}}if(k != i){buf[k][0]=buf[i][0]^buf[k][0];buf[i][0]=buf[i][0]^buf[k][0];buf[k][0]=buf[i][0]^buf[k][0];buf[k][1]=buf[i][1]^buf[k][1];buf[i][1]=buf[i][1]^buf[k][1];buf[k][1]=buf[i][1]^buf[k][1];}}sum = 0;for(i=0; i<s; i++){if(m>buf[i][1]){sum += (buf[i][0]*buf[i][1]);m -= buf[i][1];}else{sum += (buf[i][0]*m);break;}}printf("%d\n", sum);}return 0;}