01背包

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

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值