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]);
	

 

波动数列 - AcWing

分析

 参考背包

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背包+波动数列的主要内容,如果未能解决你的问题,请参考以下文章

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

波动数列

数据结构与算法面试题80道(21)

第三讲 数学与简单DP完结

数据结构与算法—01背包问题

动态规划1 —— 01背包详解