背包问题
                                                时间限制: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。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65

讲解:应注意题中所说的“它是可以分割的”,这就好办了,直接价值进行排序,然后再填充背包就可以了,以下是代码

#include<stdio.h>
int main()
{
int n,i,j,x,y,t,m,sum;
int a[],b[];
scanf("%d",&n);
while(n--)
{sum=;
scanf("%d %d",&x,&y);
for(i=;i<x;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
for(j=;j<x-;j++)
for(i=;i<x--j;i++)
{
if(a[i]<a[i+])
{
t=a[i];a[i]=a[i+];a[i+]=t;//按价值进行排序,然后重量也相应的变化
m=b[i];b[i]=b[i+];b[i+]=m;
}
}
for(i=;i<x;i++)
{
if(b[i]>=y) //看最大价值时的重量,如果大于或等于则直接取出和总质量相同的,然后就结束;
{sum=sum+y*a[i];break;}
else
{
sum=sum+a[i]*b[i];
y=y-b[i]; //放一个物体质量相应的减少,然后循环到上面,进行判断;
}
}
printf("%d\n",sum);
}
return ;
}

最新文章

  1. [转]C语言SOCKET编程指南
  2. Cannot find or open the PDB file问题的解决
  3. (实用篇)PHP不用递归遍历目录下所有文件的代码
  4. linux内核中sys_poll()的简化分析
  5. iOS 跳转到系统的设置界面-b
  6. tomcat 设置默认编码格式
  7. 【数学】HDU 5761 Rower Bo
  8. fedora audacious 不能播放音乐
  9. 手游开发者大会交流OGEngine新版本发布
  10. 款待奶牛(treat)
  11. 封装OkHttp,通过Callback改造Callback实现
  12. [mysql]ERROR 1364 (HY000): Field &#39;ssl_cipher&#39; doesn&#39;t have a default value 解决方法
  13. concurrent.futures
  14. java设计模式--观察者模式(Observer)
  15. vsftpd详细配置
  16. webRTC中音频相关的netEQ(一):概述
  17. MVC报错:找到多个与名为“Home”的控制器匹配的类型。
  18. Redis数据备份、安全、管理服务器笔记
  19. 吴裕雄 python 数据处理(2)
  20. Ubuntu 安装 Telnet

热门文章

  1. 【PHP】Ajax跨域解决方案 、jsonp、cors
  2. Spring的缺点有哪些--Ext扩展
  3. maven-compiler-plugin升级到3.1出现问题(转)
  4. STRTOK函数和STRTOK_R函数
  5. linux运维常见英文报错中文翻译(菜鸟必知)
  6. magento的一些小技巧(转)
  7. PWA 入门: 写个非常简单的 PWA 页面
  8. Java中Map相关的快速查找算法与唯一性(转载)
  9. 【转】IT业给世界带来的危机
  10. 不常用但很有用的git show 和 git blame