多重背包--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 ...
随机推荐
- [转] getBoundingClientRect判断元素是否可见
getBoundingClientRect介绍 getBoundingClientRect获取元素位置 getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视 ...
- 通过CSS自动截取字符串长度
Table Tr TD的自动换行 <style type="text/css"> table { width: 30em; table-layout: fixed; ...
- javascript 语句和严格模式(三)
一.语句 javascript程序由语句组成,语句遵守特定的语法规则. block break continue empty if...else switch try catch var functi ...
- cuda by example【读书笔记2】
常量内存 用常量内存来替换全局内存可以有效的减少内存带宽 __constant__修饰符标识常量内存,从主机内存复制到GPU上的常量内存时,需要特殊版本的cudaMemcpy(): cudaMemcp ...
- [LeetCode] Best Time to Buy and Sell Stock 6道合集【DP】
1. Best Time to Buy and Sell Stock 2. Best Time to Buy and Sell Stock II 3. Best Time to Buy and Sel ...
- 【Android】修改Android 模拟器IMEI
修改Android 模拟器IMEI 在.....\android_sdk\tools文件下找到emulator-arm.exe,使用UltraEdit文本编辑器打开,搜索CGSN关键字,把000000 ...
- c_数据结构_顺序表
#define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define ...
- 修改tomcat的默认访问日志信息
修改前:
- JMeter命令行参数汇总
jmeter.properties文件,默认是使用JMETER_HOME/bin目录下的jmeter.properties,如果用户自定义有其它的配置,在这里加上 #用法如下: -p user.p ...
- 使用ycsb对hbase0.94.11 benchmark
Ycsb下载地址:https://github.com/brianfrankcooper/YCSB/releases 目前测试hbase0.94.11,因此下载ycsb-0.1.4.tar.gz 1. ...