• 0-1背包问题


    最基础的背包问题:每种物品仅有一件,可以选择放或者不放!

        动态转移方程:f[i, v] = max {  f [i-1][v] ,    f [i-1] [j - c[i] ]+w[i]  } ;

                                              // 不放第 i 件     // 如果放进去(但是要保证放进去前,剩余空间够大 )

                                              比较这两项的价值,我们会选择最大的 放进背包里!

       0-1背包:两种方式!

       (1)建立二维数组 f [N][N];

             伪代码: for( i=1 ->  n )

                              {

                                 for( j=1 ->  v  )

                                    {

                                         dp[i][j] = dp[i-1][j];
                                          if(j>=p[i])
                                                 f [i][j] = max( f [i-1][j],   f [i-1][ j-c [i] ]+w[i]  ) ;

                                     }

                               }

     *******************************

       

    #include <stdio.h>
    #define N 1006
    int dp[N][N], w[N], p[N];
    int max(int a, int b)
    {
    	return a > b ? a : b;
    }
    void main()
    {
    	int t, n, v,i, j;
    	scanf("%d", &t);
    	while(t--)
    	{
    		scanf("%d %d", &n, &v);
    		for(i=1; i<=n; i++)
    		{
    			scanf("%d", &w[i]);
    		}
    		for(i=1; i<=n; i++)
    		{
    			scanf("%d", &p[i]);
    		}
    
    
    		for(i=0; i<=n; i++)
    		{
    			dp[i][0] = 0;
    		}
    		for(i=0; i<=v; i++)
    		{
    			dp[0][i] = 0;
    		}
    		for(i=1; i<=n; i++)
    		{
    			for(j=0; j<=v; j++)
    			{
    				dp[i][j] = dp[i-1][j];
    				if(j>=p[i]) //前提是背包放得下,j代表背包体积, p[i]代表花费
    					dp[i][j] = max(dp[i-1][j-p[i]]+w[i], dp[i-1][j]);
    			}
    		}
    		printf("%d
    ", dp[n][v]);
    	}
    }
    

       (2) 建立一维数组 f [N]

            伪代码:

            memset( f, 0, sizeof( f ) );

            for(i=1; i<=n; i++)
            {
                for(j=v; j>=c[i]; j-- )
                {
                    f [j] = max (  f [j],  f[ j- c[i] ] + w[i] );

                }
            }

            

  • 相关阅读:
    关于项目中 "不能创建大小为 8190 的行,该大小大于所允许的最大行大小 8060 "的处理
    sql 使用with 递归
    ssh,安全验证的级别(来自BD百科)
    Windows系统自带路由命令Route add,解决双网卡网络流向问题
    irreversiblecipher和cipher区别(华为交换机)
    Centos7重置root密码(20220527 02:03测试可用)
    2022中级财务管理相关公式的总结
    移动端软键盘顶出nav
    React.Component生命周期
    Axure 9 单选效果
  • 原文地址:https://www.cnblogs.com/yspworld/p/3877270.html
Copyright © 2020-2023  润新知