多重背包

有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的更多相关文章

  1. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  2. 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 ...

  3. coins_多重背包

    ps:原来用新浪,可是代码的排版不是很好,所以用博客园啦,先容许我把从八月份开始的代码搬过来,从这里重新出发,希望这里可以一直见证我的成长. Time Limit: 2000/1000 MS (Jav ...

  4. hdoj 2191(多重背包)

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/ ...

  5. hdu 2191多重背包

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. Big Event in HDU(HDU 1171 多重背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. Coins(hdu 2844 多重背包)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. POJ 1472 Coins (多重背包+滚动数组)

    Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 25827 Accepted: 8741 Description Pe ...

  9. HDU2844_Coins【多重背包】【二进制优化】

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

随机推荐

  1. module.exports与exports的区别

    引言 每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {} 例子 foo.js exports.a = functi ...

  2. Lambda表达式树构建(上)

    概述 Lambda是C#常用的语句,采用委托等方式,来封装真实的代码块.Lambda其实就是语法糖,是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可 ...

  3. Python_xml

    xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议) ET(xml.etree.ElementTree)中的几个类: ...

  4. 关于mac远程链接window服务器以及实现共享文件

    要最近换了新电脑mac 虽然运行速度666  但是真的很多地方都使用不习惯 这里记录一下 关于 远程链接window主机的问题 方便以后用 首先是 链接: 在应用里 找到    然后类似于  wind ...

  5. Python学习(二十七)—— Django和pymysql搭建学员管理系统

    转载自http://www.cnblogs.com/liwenzhou/p/8270250.html 一.学员管理系统 1.项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的e ...

  6. openstack2 kvm

    一.kvm安装 1.首先虚拟机的话需要打开虚拟化功能,服务器的话需要在bios中设置 2.安装kvm用户态管理工具qemu-kvm 和 用来管理kvm虚拟机的插件libvirt和创建虚拟机用的virt ...

  7. idea配置web项目启动的详细说明

    每次用完一个编辑器以后 ,再换另一个编辑器使用 过段时间再回来使用idea,总是会忘记些什么  ,毕竟每个编辑器的风格和结构都有所区别 特此记下笔记   方便以后查看 图片文字看不清的   请在图片上 ...

  8. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  9. webapp用户身份认证方案 JSON WEB TOKEN 实现

    webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...

  10. sql union 列的字段不一样的时候