每天手写一遍01背包

题目链接:https://www.acwing.com/problem/content/2/
01背包,一维更新,更新时要从大到小枚举
状态转移方程:f[j] = max( f[j] , f[j-v] + w] );
需要从大到小枚举的原因是,为了使f[j-v]是i-1的状态而不是i的状态。因为v>0,从大到小更新的话,那么f[j-v]一定还没有更新到,所以是i-1的状态。

2021年11月04日

#include<bits/stdc++.h>
using namespace std;

const int N=1001;

int n,m;
int f[N];

int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
} 

2021年11月05日

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int f[N];
int n,m;

int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
}

2021年11月06日

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int f[N];
int n,m;
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
}

2021年11月07日

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int n,m;
int f[N];
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
}

2021年11月08日

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int n,m;
int f[N];
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
}

2021年11月09日

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int f[N];
int n,m;
int main(void)
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			f[j]=max(f[j],f[j-v]+w);
	}
	cout<<f[m]<<endl;
	return 0;
}

我已经闭着眼睛都能写出来了,以后不想写了。

posted @ 2021-11-04 17:33  longwind7  阅读(31)  评论(0编辑  收藏  举报