完全背包笔记

完全背包

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


posted @ 2020-04-27 22:04  BorisDimitri  阅读(36)  评论(0编辑  收藏  举报