zoukankan      html  css  js  c++  java
  • 完全背包笔记

    完全背包

    1.状态表示

    a.集合:所有从第i个物品开始选,总体积不超过j的物品的集合

    b.属性:max

    2.状态计算:

    a.f[i]的子集划分只要总体积不超过j就可以一直选

    如上图,在1到i中选,且总体积小于等于j,
    但第i个物品只能选0个,所以不选第i个物品
    故最大值为f[i-1,j]

    ps:做所有DP问题的时候,核心就是这个集合的定义

    三重简化成2重的推导过程

    总体推导过程:

    核心伪代码:

    最终代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int n,v;
    int c[1005],w[1005];
    int f[1005][1005]; 
    
    int main()
    {
    	scanf("%d%d",&n,&v);
    	for(int i=1; i<=n; i++)
    	{
    		scanf("%d%d",&w[i],&c[i]);
    	}
    	//输入
    
    	for(int i=1; i<=n; i++)
    	{
    		for(int j=1;j<=v; j++)
    		{
    			f[i][j]=f[i-1][j];
    			if(j>=w[i]) 
    			{
    				f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
    			}
    		}
    	}
    	//核心代码
    	
    	printf("%d",f[n][v]); 
    	
    	return 0;
    }
    
    
    
  • 相关阅读:
    初识数据库与SQL语句
    初始面向对象
    集合与深浅copy
    函数进阶
    函数操作
    文件操作
    生成器与列表生成式
    函数名的本质,闭包和迭代
    小数据库
    DAY 5 字典
  • 原文地址:https://www.cnblogs.com/BorisDimitri/p/13546613.html
Copyright © 2011-2022 走看看