多重背包--java
多重背包
有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值 是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大
母函数的思想也是如此 给你 价值, 物品数量的限制, 然后凑,
hdu2191
第一种写法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int m = sc.nextInt();
int v[] = new int[101];
int w[] = new int[101];
int num[] = new int[101];
for (int i = 0; i < m; i++) {
v[i] = sc.nextInt();
w[i] = sc.nextInt();
num[i] = sc.nextInt();
}
int dp[] = new int[10001];
for (int i = 0; i <= m; i++)
dp[i] = 0;
for (int i = 0; i < m; i++) {
for (int k = 0; k <= num[i]; k++) {
for (int j = n; j >= v[i]; j--) {
if (dp[j] < dp[j - v[i]] + w[i]) {
dp[j] = dp[j - v[i]] + w[i];
}
}
}
}
System.out.println(dp[n]);
}
}
}
第二种写法:
package demo2;
import java.util.*;
public class Main {
public static int sum(int []n){
int sum=0;
for(int i=0;i<n.length;i++)
sum+=n[i];
return sum;
}
public static int back(int []a,int []v,int[]n,int m){
int sum=sum(n);
int a1[]= new int[sum];
int v1[]=new int[sum];
for(int i=0;i<a.length;i++)
a1[i]=a[i];
for(int i=0;i<v.length;i++)
v1[i]=v[i];
int k= a.length;
for(int i=0;i<n.length;i++){
while(n[i]!=1){
a1[k]=a[i];
v1[k]=v[i];
k++;
n[i]--;
}
}
int dp[]=new int[m+1];
for(int i=0;i<a1.length;i++){
for(int j=m;j>=a1[i];j--){
dp[j] = Math.max(dp[j],dp[j-a1[i]]+v1[i]);
}
}
return dp[m];
}
public static void main(String[] args) {
int[] a = {1,2,3};
int[] v = {2,1,4};
int[] n = {5,4,2};
int m = 6;
int value = back(a,v,n,m);
System.out.println(value);
}
}
优化写法:
将多重背包转换为完全背包
public class duochongbeibao1 {
public static int[] a = {1,2,3};//重量
public static int[] v = {2,1,4};//价值
public static int[] n = {5,4,2};//数量
public static int m = 6;
public static int back(int[] a,int[] v,int[] n,int m){
int value = fun(a.length-1,m);
return value;
}
public static int fun(int i,int m){
if(i == 0)
return(m/a[i]<n[i]?m/a[i]:n[i])*v[i];
else{
int x = (m/a[i]<n[i]?m/a[i]:n[i]) + 1;
int[] dp = new int[x];
for(int j = 0;j<x;j++)
dp[j] = fun(i-1,m-j*a[i])+j*v[i];
return max(dp);
}
}
public static int max(int[] dp){
int index = 0;
if(dp.length == 0)
return -1;
for(int i = 1;i<dp.length;i++){
if(dp[i]>dp[index])
index = i;
}
return dp[index];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int value = back(a,v,n,m);
System.out.println(value);
}
}
多重背包--java的更多相关文章
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- HDU 1171 Big Event in HDU 多重背包二进制优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...
- coins_多重背包
ps:原来用新浪,可是代码的排版不是很好,所以用博客园啦,先容许我把从八月份开始的代码搬过来,从这里重新出发,希望这里可以一直见证我的成长. Time Limit: 2000/1000 MS (Jav ...
- hdoj 2191(多重背包)
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/ ...
- hdu 2191多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Big Event in HDU(HDU 1171 多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Coins(hdu 2844 多重背包)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- POJ 1472 Coins (多重背包+滚动数组)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 25827 Accepted: 8741 Description Pe ...
- HDU2844_Coins【多重背包】【二进制优化】
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- 利用sqlmap注入测试
安装:yum install -y gitcd /usr/local && git clone https://github.com/sqlmapproject/sqlmap.gitc ...
- PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://xxxx.wsdl'
libxml_disable_entity_loader(false); $client = new \SoapClient($wsdl); 完美解决办法加上 php的soap扩展是否安装 open ...
- Java集合源码学习(四)HashMap
一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点, ...
- java运算符-逻辑、三元运算符
1.逻辑运算符 逻辑运算符,它是用于布尔值进行运算的,运算的最终结果为布尔值true或false. 运算符 运算规则 范例 结果 & 与 false&true False | 或 fa ...
- One point compactification
Theorem (One point compactification) Any locally compact space \(X\) can be embedded in another comp ...
- [转]编程珠玑第五章二分搜索(折半查找)之java实现
http://blog.csdn.net/hwe_xc/article/details/51813080 二分搜索又称为折半查找,用来高效快速的解决如下问题: 我们需要确定排序后的数组x[0..n-1 ...
- Codeforces 1017F The Neutral Zone (看题解)
这题一看就筛质数就好啦, 可是这怎么筛啊, 一看题解, 怎么会有这么骚的操作. #include<bits/stdc++.h> #define LL long long #define f ...
- 环境变量误删path找回方法与mysql基础命令
环境变量误删path找回方法用户path:%USERPROFILE%\AppData\Local\Microsoft\WindowsAppsWin+R 输入regedit 打开注册表(开始-运行里输入 ...
- 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法
3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...
- jQuery获得页面绝对和相对的位置
获得某一元素绝对x,y位置,可以用offset方法 var X = $('#DivID').offset().top; var y=$("#divid").offset().lef ...