NYOJ题目106背包问题

来源:互联网 发布:薛之谦为什么复婚知乎 编辑:程序博客网 时间:2024/05/04 10:50

背包问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值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># include <stdlib.h>struct pack{int v;int w;};int cmp(const void *a, const  void *b){struct pack *c = (pack *)a;struct pack *d = (pack *)b;if (c->v != d->v)return d->v - c->v;elsereturn d->w - c->w;}int main(void){int n;scanf("%d", &n);while (n--){         int s, m, i;struct pack p[10];scanf("%d %d", &s, &m);for (i=0; i<s; ++i)scanf("%d %d", &p[i].v, &p[i].w);        qsort(p, s, sizeof(p[0]), cmp);    int j=0, sum=0;while (sum < m){sum = sum + p[j].w;j++;}int sumv = 0;if (sum == m){for (i=0; i<j; ++i)sumv = sumv + p[i].v*p[i].w;printf("%d\n", sumv);}else{int heavy = 0;            for (i=0; i<j-1; ++i){sumv = sumv + p[i].v*p[i].w;        heavy = p[i].w + heavy;}p[i].w = m - heavy;sumv = sumv + p[i].w*p[i].v;printf("%d\n", sumv);}}return 0;}


0 0