01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
来源:互联网 发布:电脑编程有没有女孩 编辑:程序博客网 时间:2024/05/31 19:11
import java.util.Scanner;
public class 背包01问题d {
/*
*
5 100
77 92
22 22
29 87
50 46
99 90
133
*
*/
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
// i层剩余容量j
// d[i,j]=max{d(i+1,j),d(i+1,j-V[i])+W[i])}
while (cin.hasNext()) {
int n = cin.nextInt();
int C = cin.nextInt();
int V[] = new int[n+1];
int W[] = new int[n+1];
int d[][] = new int[C+1][C+1];// 目标状态d
for (int i = 0; i < n; i++) {
V[i] = cin.nextInt();
W[i] = cin.nextInt();
}
for (int i = n; i >= 1; i--) {// 层
for (int j = 0; j <= C; j++) {// 剩余量
d[i][j] = (i == 0 ? 0 : d[i + 1][j]);// 不选
if (j >= V[i]) // 选择该层
d[i][j] = Math.max(d[i][j], d[i + 1][j - V[i]] + W[i]);
}
}
System.out.println(d[1][C]);
}
}
}
------------------------
package com.supermars.practice;
import java.util.Scanner;
public class 背包01问题规划方向f {
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
// i层剩余容量j
// d[i,j]=max{d(i+1,j),d(i+1,j-V[i])+W[i])}
while (cin.hasNext()) {
int n = cin.nextInt();
int C = cin.nextInt();
int V[] = new int[n + 1];
int W[] = new int[n + 1];
int f[][] = new int[C + 1][C + 1];// 目标状态d
for (int i = 0; i < n; i++) {
V[i] = cin.nextInt();
W[i] = cin.nextInt();
}
//f(i,j)=max{f(i-1,j),f(i-1,j-V[i])+W[i]}
for (int i =1; i <=n; i++) {//层
for (int j = 0; j <=C; j++) {//当前量
f[i][j]=(i==1?0:f[i-1][j]); //不选
if(j>=V[i]){ //选择
f[i][j]=Math.max(f[i][j],f[i-1][j-V[i]]+W[i]);
}
}
}
System.out.println(f[n][C]);
}
}
}
------------------------
package com.supermars.practice;
import java.util.Scanner;
public class 背包01滚动数组 {
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
// i层剩余容量j
// d[i,j]=max{d(i+1,j),d(i+1,j-V[i])+W[i])}
while (cin.hasNext()) {
int n = cin.nextInt();
int C = cin.nextInt();
int V[] = new int[n + 1];
int W[] = new int[n + 1];
int f[] = new int[C + 1];// 目标状态d
for (int i = 0; i < n; i++) {
V[i] = cin.nextInt();
W[i] = cin.nextInt();
}
// f(i,j)=max{f(i-1,j),f(i-1,j-V[i])+W[i]}
for (int i = 1; i <= n; i++) {// 层
for (int j = C; j >= 0; j--) {// 当前量
if (j >= V[i])
f[j] = Math.max(f[j], f[j - V[i]] + W[i]);
}
}
System.out.println(f[C]);
}
}
}
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- (i++)+(++i)+(++i)+(++j)+(j++)问题
- i+++j
- java i+=j 与 i = i+j 区别
- for(i=0,j=0;i<10,j<6;i++,j++)问题
- 【T.I.J】Map通过关联数组的简单实现
- boj 1347 简单数组问题 在一个二维数组中 a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1] 则a[i][j]为i j位置左上侧所有元素之和
- StackOverflow 问题的笔记:关于 i+ = j 的实现
- 基本的code,数组循环i,j
- 由height数组构造lcp(i,j)
- 关于二维数组a[i][j]
- sscanf(getenv("QUERY_STRING"),"i=%d&j=%d",&i,&j);
- Java实现-背包问题I
- 找数组的i,j(j>i)使得a[j] - a[i]的值最大(算法)
- 【分治法】在数组A中,返回i<j,且A[i]>A[j]的(i,j)配对的数量
- n[i][j] <= n[i][j+1] n[i][j] <= n[i+1][j]
- main() {int i,j;
- for i,j
- 图像特征提取LBP
- HDU 3832
- Latex 绘图小清新
- 学习maven的使用,看到一篇很实用的入门教程 .
- 重写equals方法的同时为什么要重写hashcode方法
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- ccd和cmos的区别
- Java虚拟机原理、内存分配和回收机制
- Java多线程学习
- H - Windmill Animation
- 经典SQL--求一年有多少天
- Java SSH框架学习(入门)
- iOS虚拟键盘上添加动态按钮
- 八码数问题