01背包记录路径并输出
package co;
class co//核心就是写了个01背包
{
static int cun[]=new int [200];
static int path[][]=new int[110][15200];//路径数组
static
int dp[][]=new int [110][15200];//dp数组
static void solve(int i,int j)//输出所有的方案
{
int x=0,sum=0;
while((i!=0)&&(j!=0))
{
if(path[i][j]>0)
{
cun[x++]=a[i];
sum+=a[i];
j=j-a[i];
}
i--;
}
if(sum>=14900&&sum<=15100)//判断一下符合再输出方案
{
for(int ii=x-1; ii>=0; ii--)
{
System.out.print(cun[ii]+" ");
}
System.out.println();
}
}
public static void main(String []args)
{
int i,j;
int n=(int)(Math.random()*100)%100;//产生随机数
if(n<50)
n+=50;
for( i=1; i<=n; i++)
{
int x=(int)(Math.random()*700)%700;//产生随机数
while(x<500)
{
x+=100;
}
a[i]=x;
}
for(i=1; i<=n; i++)//01背包
{
for(j=15100; j>=a[i]; j--)
{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
if(dp[i][j]<dp[i-1][j-a[i]]+a[i])
{
path[i][j]=1;
dp[i][j]=dp[i-1][j-a[i]]+a[i];
}
}
}
for( i=1; i<=n; i++)//这个地方枚举哪一个数是结尾
{
for( j=14900; j<=15100; j++)//这个地方枚举最后组合成了哪个数
{
solve(i,j);
}
}
}
}