2. 01背包问题 - AcWing题库
分析:
代码:
import java.util.Scanner;
/*
* 01背包
* 下面用到的空间1000*4*2+1000*1000*4=4.008*10的6次方个字节
* 64MB=64*1024*1024=6*10的7次方个字节
* 没有超出
*/
public class Main {
static int N=1010;
static int v[]=new int[N];
static int w[]=new int[N];
static int f[][]=new int[N][N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
for(int i=1;i<=n;i++) {
v[i]=sc.nextInt();
w[i]=sc.nextInt();
}
//初始化而f(0,0-m)等于0,所以下面直接从1开始
for(int i=1;i<=n;i++) {
for(int j=0;j<=m;j++) {
f[i][j]=f[i-1][j];
if(j>=v[i]) {
f[i][j]=Math.max(f[i-1][j], f[i-1][j-v[i]]+w[i]);
}
}
}
System.out.println(f[n][m]);
}
}
分析
参考背包
j是余数
代码
import java.util.Scanner;
public class Main {
static int N=1010;
static int MOD=100000007;
static int f[][]=new int[N][N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n,s,a,b;
n=sc.nextInt();
s=sc.nextInt();
a=sc.nextInt();
b=sc.nextInt();
f[0][0]=1;
for(int i=1;i<n;i++) {
for(int j=0;j<n;j++) {
f[i][j]=(f[i-1][get_mod(j-a*i,n)]+f[i-1][get_mod(j+b*i,n)])%MOD;
}
}
System.out.println(f[n-1][get_mod(s, n)]);
}
public static int get_mod(int a,int b) {
return (a%b+b)%b;
}
}