01背包+波动数列
Posted 猪八戒1.0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01背包+波动数列相关的知识,希望对你有一定的参考价值。
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;
以上是关于01背包+波动数列的主要内容,如果未能解决你的问题,请参考以下文章