【动态规划】完全背包
2017-05-01 16:55
162 查看
完全背包
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述
直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。本题要求是背包恰好装满背包时,求出最大价值总和是多少。如果不能恰好装满背包,输出NO
输入第一行: N 表示有多少组测试数据(N<7)。
接下来每组测试数据的第一行有两个整数M,V。 M表示物品种类的数目,V表示背包的总容量。(0<M<=2000,0<V<=50000)
接下来的M行每行有两个整数c,w分别表示每种物品的重量和价值(0<c<100000,0<w<100000)
输出对应每组测试数据输出结果(如果能恰好装满背包,输出装满背包时背包内物品的最大价值总和。 如果不能恰好装满背包,输出NO)
样例输入
2 1 5 2 2 2 5 2 2 5 1
样例输出
NO 1
/**
*
*/
package 动态规划;
import java.util.Scanner;
/**
* @作者: gx_143
* @创建时间: 2017-4-30上午08:56:09
*/
public class T7完全背包 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] out=new int
;
for (int i = 0; i < out.length; i++) {
int m=sc.nextInt();
int v=sc.nextInt();
int[] need=new int[m+1];
int[] value=new int[m+1];
for (int j = 1; j < value.length; j++) {
need[j]=sc.nextInt();
value[j]=sc.nextInt();
}
out[i]=f(m,v,need,value);
}
for (int i = 0; i < out.length; i++) {
if(out[i]==-1)
System.out.println("NO");
else
System.out.println(out[i]);
}
}
private static int f(int m, int v, int[] need, int[] value) {
int[] dp=new int[v+1];
for (int i = 1; i < dp.length; i++) {
dp[i]=-10000000;
}
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= v; j++) {
if(j>=need[i])
dp[j]=Math.max(dp[j], dp[j-need[i]]+value[i]);
}
}
if(dp[v]<0)
return -1;
return dp[v];
}
}
相关文章推荐
- 动态规划之完全背包
- 【动态规划】完全背包问题
- POJ3181 动态规划 完全背包
- POJ 1837 Balance [动态规划——完全背包]
- 第八届蓝桥杯 包子凑数(动态规划/完全背包+扩展欧几里得)
- POJ1384-动态规划02完全背包
- 动态规划学习之0-1背包和完全背包
- nyoj311 完全背包(动态规划)
- 动态规划-----完全背包
- 动态规划—完全背包
- 动态规划 杭电1171 0-1背包和完全背包结合
- 完全背包问题 动态规划
- 算法竞赛入门经典:第九章 动态规划初步 9.2完全01背包
- 动态规划(完全背包的变形)
- hiho 完全背包(动态规划)
- 动态规划 杭电1171 0-1背包和完全背包结合
- hiho第七周——完全背包(动态规划)
- 完全背包--动态规划
- poj 2063 Investment 动态规划 完全背包问题
- hdu 1114 Piggy-Bank 动态规划+完全背包