Fuzhou oj--福建省校赛重现
2015-12-27 17:55
204 查看
Problem C Knapsack problem
Accept: 83 Submit: 457
Time Limit: 3000 mSec Memory Limit : 32768 KB
Problem Description
Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the items into a knapsack so that the total weight is less than or equal to a given limit B and the total value is as large as possible. Find the maximum total value.(Note that each item can be only chosen once).
Input
The first line contains the integer T indicating to the number of test cases.For each test case, the first line contains the integers n and B.
Following n lines provide the information of each item.
The i-th line contains the weight w[i] and the value v[i] of the i-th item respectively.
1 <= number of test cases <= 100
1 <= n <= 500
1 <= B, w[i] <= 1000000000
1 <= v[1]+v[2]+...+v
<= 5000
All the inputs are integers.
Output
For each test case, output the maximum value.
Sample Input
15 1512 42 21 14 101 2
Sample Output
15解体思路:0-1背包,只不过不是以背包容量作为限制,而是以价值作为选择限制。在输入时定义变量为 long long竟然wa了,最后改为int才过,无语.......
代码如下:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int w[510]; int v[510]; long long f[5000+10]; int main(){ int t,sum,n,b; scanf("%d",&t); while(t--){ sum=0; scanf("%d%d",&n,&b); for(int i=1;i<=n;i++){ scanf("%d%d",&w[i],&v[i]); sum+=v[i]; } memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++){ for(int j=sum;j>=v[i];j--){ f[j]=min(f[j],f[j-v[i]]+w[i]); } } for(int i=sum;i>=0;i--){ if(f[i]<=b){ printf("%d\n",i); break; } } } return 0; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- Mongodb聚合
- 滤波器基础
- 我的进阶书单记录(少喝鸡汤,多读书
- 低端单片机(8bit)的16路舵机调速分析与实现
- 老男孩教育26期学员学习体会
- STM32的USB多包数据传送(转贴)
- yii的多个相同modle表单提交问题(未解决)
- app后端设计--总目录
- LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]
- 行编辑器sed
- hdu 01 Matrix
- 分享一下PHP中的While循环函数,以前觉得挺难的
- Windows系统性能提升方法
- C#中Console.WriteLine()的用法
- 如何学习递归,回溯,DFS,BFS.
- ContentProvider
- linux(CentOS6.5)之postfix服务器编译安装
- 使用PHP循环函数的一些知识,那些不曾了解的知识
- 库函数 产生任意不重复随机数