例如:有5件物品,体积分别为[2,2,6,5,4],价值分别为[6,3,5,4,6]
//0-1背包问题
import java.util.*;
public class ll {
public static void main(String[] args) {
int c[]=new int[105];
int w[]=new int [105];
int dp[][]=new int[105][105];
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int v=scanner.nextInt();
for (int i = 1; i <=n ; i++) {
w[i]=scanner.nextInt();//物体价值
c[i]=scanner.nextInt();//每件物体体积
}
for (int i = 1; i <=n ; i++) {
//前i个物品
for (int j = 0; j <=v ; j++) {
if (j>=c[i]){
dp[i][j]=Math.max(dp[i-1][j-c[i]]+w[i],dp[i-1][j]);
}else {
dp[i][j]=dp[i-1][j];
}
}
}
System.out.println(dp[n][v]);
}
}
/*
--cin:
5 10 //数量 体积
2 1 //单件价值 重量
3 5
2 5
3 4
4 3
--cout: //最大价值
9
*/
import java.util.*;
public class ll {
public static void main(String[] args) {
int c[]=new int[105];
int w[]=new int [105];
int dp[]=new int[105];
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int v=scanner.nextInt();
for (int i = 1; i <=n ; i++) {
w[i]=scanner.nextInt();//物体价值
c[i]=scanner.nextInt();//每件物体体积
}
for (int i = 1; i <=n ; i++) {
//前i个物品
for (int j = v; j >=c[i] ; j--) {
dp[j]=Math.max(dp[j-c[i]]+w[i],dp[j]);
}
}
System.out.println(dp[v]);
}
}
01背包问题魔改
用 价值/体积 得到单位体积物品的价值量
并 从高到低 进行排序,在总体积允许的范围内
尽可能选择 单位价值 更高的物品
import java.util.*;
public class ll {
public static class cmp implements Comparator<Bao>{
@Override
public int compare(Bao a, Bao b) {
return b.w/b.c-a.w/a.c;
}
}
public static class Bao{
int w;
int c;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int v=scanner.nextInt();
Bao bao[]=new Bao[n];
for (int i = 0; i <n ; i++) {
bao[i]=new Bao();
bao[i].w=scanner.nextInt();//物体价值
bao[i].c=scanner.nextInt();//每件物体体积
}
Arrays.sort(bao,new cmp());
int sumw=0,sumc=0;
for (int i = 0; i < n; i++) {
int tc=sumc+bao[i].c;
int tw=sumw+bao[i].w;
if(tw>sumw&&tc<v){
sumw=tw;
sumc=tc;
}
}
System.out.println(sumw);
}
}
有N种物品,第i种物品的体积是Ci ,价值是Wi,每种物品有 Ni 件,有体积为V的背包,求最大价值
01背包就是特殊的多重背包(多重背包里面Ni件物品相当于01背包中Ni件相同的物品)
import java.util.*;
public class ll {
public static void main(String[] args) {
int [][]dp=new int[21][1010];
int w[]=new int[21];
int c[]=new int[21];
int n[]=new int[21];
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();//物体数
int V=scanner.nextInt();//体积
for (int i = 1; i <=N ; i++) {
w[i]=scanner.nextInt();//价格
c[i]=scanner.nextInt();//体积
n[i]=scanner.nextInt();//个数
}
for (int i = 1; i <=N ; i++) {
//前i个物品
for (int j = 0; j <=V ; j++) {
for (int k = 0; k <=n[i] ; k++) {
if (j>=c[i]*k){
dp[i][j]=Math.max(dp[i-1][j-c[i]*k]+w[i]*k,dp[i][j]);
}
}
}
}
System.out.println(dp[N][V]);
}
}
import java.util.*;
public class ll {
public static void main(String[] args) {
int [][]dp=new int[21][1010];
int w[]=new int[21];
int c[]=new int[21];
int n[]=new int[21];
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();//物体数
int V=scanner.nextInt();//体积
for (int i = 1; i <=N ; i++) {
w[i]=scanner.nextInt();//价格
c[i]=scanner.nextInt();//体积
n[i]=scanner.nextInt();//个数
}
for (int i = 1; i <=N ; i++) {
//前i个物品
for (int j = V; j>=0 ; j++) {
for (int k = 0; k <=n[i] ; k++) {
if (j>=c[i]*k){
dp[j]=max(dp[j-c[i]*k]+w[i]*k,dp[j]);
}
}
}
}
System.out.println(d[V]);
}
}
当前有N中物品,第i中物品的体积是Ci ,价值是 Wi
每种物品的数量是无限的,可以选若干件,
有容量为 V 的背包,求最大价值
import java.util.*;
public class ll {
public static void main(String[] args) {
int c[]=new int[21];
int w[]=new int [21];
int dp[][]=new int[21][1010];
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int v=scanner.nextInt();
for (int i = 1; i <=n ; i++) {
w[i]=scanner.nextInt();//物体价值
c[i]=scanner.nextInt();//每件物体体积
}
for (int i = 1; i <=n ; i++) {
//前i个物品
for (int j = 0; j <=v ; j++) {
if(j>=c[i]){
dp[i][j]=Math.max(dp[i][j-c[i]]+w[i],dp[i-1][j]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}
System.out.println(dp[n][v]);
}
}
import java.util.*;
public class ll {
public static void main(String[] args) {
int c[]=new int[21];
int w[]=new int [21];
int dp[][]=new int[21][1010];
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int v=scanner.nextInt();
for (int i = 1; i <=n ; i++) {
w[i]=scanner.nextInt();//物体价值
c[i]=scanner.nextInt();//每件物体体积
}
//空间优化
for(int i=1;i<=N;i++){
for(int j=c[i];j<=V;j++){
dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
}
}
System.out.println(dp[v]);
}
}