01背包
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
int n,c;
n=scan.nextInt();
c=scan.nextInt();
int w[]=new int[n];
int v[]=new int[n];
int res[]=new int[n];
for(int i=0;i<n;i++)
res[i]=0;
int j=0;
while(j<n){
w[j]=scan.nextInt();
v[j]=scan.nextInt();
j++;
}
int value=knapsack(w,v,res,n,c);
System.out.println(value);
for(int i=0;i<n;i++){
System.out.print(res[i]+" ");
}
System.out.println();
}
static int knapsack(int w[],int v[],int res[],int n,int c){
int value=0;
int f[][]=new int[n][c+1];
for(int i=0;i<n;i++)
for(int j=0;j<=c;j++)
f[i][j]=0;
for(int j=1;j<=c;j++)
f[0][j]=(j<w[0])?0:v[0];
for(int i=1;i<n;i++)
for(int j=1;j<=c;j++){
if(j>=w[i]){
f[i][j]=(f[i-1][j]>(f[i-1][j-w[i]]+v[i]))?f[i-1][j]:(f[i-1][j-w[i]]+v[i]);
}else{
f[i][j]=f[i-1][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=c;j++){
System.out.print(f[i][j]+" ");
}
System.out.println();
}
value=f[n-1][c];
int y=c;
int x=n-1;
while(x!=0){
if(y-w[x]>=0&&f[x][y]==(f[x-1][y-w[x]]+v[x])){
res[x]=1;
y=y-w[x];
}
x--;
}
if(f[0][y]!=0){
res[0]=1;
}
return value;
}
完全背包
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
int n,c;
n=scan.nextInt();
c=scan.nextInt();
int w[]=new int[n];
int v[]=new int[n];
int res[]=new int[n];
for(int i=0;i<n;i++)
res[i]=0;
int j=0;
while(j<n){
w[j]=scan.nextInt();
v[j]=scan.nextInt();
j++;
}
int value=knapsack(w,v,res,n,c);
System.out.println(value);
for(int i=0;i<n;i++){
System.out.print(res[i]+" ");
}
System.out.println();
}
static int knapsack(int w[],int v[],int res[],int n,int c){
int value=0;
int f[][]=new int[n][c+1];
for(int i=0;i<n;i++)
for(int j=0;j<=c;j++)
f[i][j]=0;
for(int j=1;j<=c;j++)
f[0][j]=(j<w[0])?0:((j/w[0])*v[0]);
for(int i=1;i<n;i++)
for(int j=1;j<=c;j++){
if(j>=w[i]){
f[i][j]=(f[i-1][j]>(f[i][j-w[i]]+v[i]))?f[i-1][j]:(f[i][j-w[i]]+v[i]);
}else{
f[i][j]=f[i-1][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=c;j++){
System.out.print(f[i][j]+" ");
}
System.out.println();
}
value=f[n-1][c];
int y=c;
int x=n-1;
while(x!=0){
while(y-w[x]>=0&&f[x][y]==(f[x][y-w[x]]+v[x])){
res[x]++;
y=y-w[x];
}
x--;
}
res[0]=f[0][y]/v[0];
return value;
}
多重背包
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
int n,c;
n=scan.nextInt();
c=scan.nextInt();
int w[]=new int[n];
int v[]=new int[n];
int num[]=new int[n];
int res[]=new int[n];
for(int i=0;i<n;i++)
res[i]=0;
int j=0;
while(j<n){
w[j]=scan.nextInt();
v[j]=scan.nextInt();
num[j]=scan.nextInt();
j++;
}
int value=knapsack(w,v,num,res,n,c);
System.out.println(value);
for(int i=0;i<n;i++){
System.out.print(res[i]+" ");
}
System.out.println();
}
static int knapsack(int w[],int v[],int num[],int res[],int n,int c){
int value=0;
int f[][]=new int[n][c+1];
for(int i=0;i<n;i++)
for(int j=0;j<=c;j++)
f[i][j]=0;
for(int j=1;j<=c;j++) {
int count=Math.min(num[0],j/w[0]);
f[0][j] = (j < w[0]) ? 0 : (count* v[0]);
}
for(int i=1;i<n;i++)
for(int j=1;j<=c;j++){
if(j>=w[i]){
int count=Math.min(num[i],j/w[i]);
f[i][j]=f[i-1][j];
for(int k=1;k<=count;k++) {
int temp=f[i-1][j-w[i]*k]+k*v[i];
if(temp>f[i][j])
f[i][j]=temp;
}
}else{
f[i][j]=f[i-1][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=c;j++){
System.out.print(f[i][j]+" ");
}
System.out.println();
}
value=f[n-1][c];
int y=c;
int x=n-1;
while(x!=0){
int count=Math.min(num[x],y/w[x]);
for(int k=count;k>0;k--){
if(f[x][y]==(f[x-1][y-k*w[x]]+k*v[x])){
res[x]=k;
y=y-k*w[x];
break;
}
}
x--;
}
res[0]=f[0][y]/v[0];
return value;
}
二维费用的多重背包
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
int n,c1,c2;
n=scan.nextInt();
c1=scan.nextInt();
c2=scan.nextInt();
int w1[]=new int[n+1];
int w2[]=new int[n+1];
int v[]=new int[n+1];
int num[]=new int[n+1];
int res[]=new int[n+1];
for(int i=0;i<=n;i++)
res[i]=0;
int j=1;
while(j<=n){
w1[j]=scan.nextInt();
w2[j]=scan.nextInt();
v[j]=scan.nextInt();
num[j]=scan.nextInt();
j++;
}
int value=knapsack(w1,w2,v,num,res,n,c1,c2);
System.out.println(value);
for(int i=0;i<=n;i++){
System.out.print(res[i]+" ");
}
System.out.println();
}
static int knapsack(int w1[],int w2[],int v[],int num[],int res[],int n,int c1,int c2){
int value=0;
int f[][][]=new int[n+1][c1+1][c2+1];
for(int i=0;i<=n;i++)
for(int j=0;j<=c1;j++)
for(int k=0;k<c2;k++)
f[i][j][k]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=c1;j++)
for(int k=1;k<=c2;k++)
if(j>=w1[i]&&k>=w2[i]){
int count1=Math.min(num[i],j/w1[i]);
int count2=Math.min(num[i],k/w2[i]);
int count=Math.min(count1,count2);
f[i][j][k]=f[i-1][j][k];
for(int t=1;t<=count;t++) {
int temp=f[i-1][j-w1[i]*t][k-w2[i]*t]+t*v[i];
if(temp>f[i][j][k])
f[i][j][k]=temp;
}
}else{
f[i][j][k]=f[i-1][j][k];
}
value=f[n][c1][c2];
int z=c2;
int y=c1;
int x=n;
while(x!=0){
int count1=Math.min(num[x],y/w1[x]);
int count2=Math.min(num[x],z/w2[x]);
int count=Math.min(count1,count2);
for(int k=count;k>0;k--){
if(f[x][y][z]==(f[x-1][y-k*w1[x]][z-k*w2[x]]+k*v[x])){
res[x]=k;
y=y-k*w1[x];
z=z-k*w2[x];
break;
}
}
x--;
}
return value;
}