多重背包--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 ...
随机推荐
- 线程 ID
摘自<Linux 环境编程:从应用到内核> 在 Linux 中,目前的线程实现是 Native POSIX Thread Library,简称 NPTL.在这种实现下,线程又被称为轻量级进 ...
- alpha冲刺5/10
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺5 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 最近事情有点多,只是跟进了下进度,写了写博客 接下来 ...
- 在CentOS 7+ 安装Kubernetes入门(单Master)
TL;DR; ***,***,***,重要的事情说三次.如果不会***,这篇文章就没有看下去的意义.作为一个技术人员如果不愿意折腾,很难有所作为.作为一个单纯的技术人员,最好把心思放在技术上,做到真正 ...
- User模型扩展和自定义
参考如下: django文档参考 django signal使用总结 django 信号注册 django信号问题1 django oneTooneFiled 1. django 自定义用户u ...
- UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...
- BZOJ2119 股市的预测 字符串 SA ST表
原文链接https://www.cnblogs.com/zhouzhendong/p/9069171.html 题目传送门 - BZOJ2119 题意 给定一个股票连续$n$个时间点的价位,问有多少段 ...
- BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...
- springmvc基础使用配置
前言 本案例是在idea编辑器下,maven管理项目的前提下. 步骤 1.新建maven项目 2.配置web.xml <?xml version="1.0" encoding ...
- Raspberry Camera详解+picamera库+Opencv控制
使用树莓派的摄像头,将树莓派自身提供的picamera的API数据转换为Python Oencv可用图像数据: # import the necessary packages from picamer ...
- <%@include>和<jsp:include>有什么不同呢
<%@include>jsp指令先包含再处理,<jsp:include>jsp动作先处理再包含 1.执行时间上:< %@ include file=”relativeUR ...