2021-03-25 01背包

01背包问题(简单)

有 N 件物品和一个容量是 V

的背包。每件物品只能使用一次。

第 i
件物品的体积是 vi,价值是 wi

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式

第一行两个整数,N,V

,用空格隔开,分别表示物品数量和背包容积。

接下来有 N
行,每行两个整数 vi,wi,用空格隔开,分别表示第 i

件物品的体积和价值。
输出格式

输出一个整数,表示最大价值。
数据范围

0

0

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

	#include
	using namespace std;
	int f[1010][1010],n,i,j,m,v[1010],w[1010];
	int main(void)
	{
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
		  scanf("%d%d",&v[i],&w[i]);
		for(j=0;j<=m;j++)
		  for(i=1;i<=n;i++)
		  {
		    f[i][j]=f[i-1][j];//加入一件物品对当前最高价值初始化 
		    if(j>=v[i])
		    {
		    	f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);//通过比较决定是否放入,如果放入则最高价值更新数值 
			}
		  }
		  printf("%d\n",f[n][m]);//遍历完所有物品后的最高价值 
		return 0;
	 } 

解题思路
在背包体积从0到m的过程中筛选物品,通过比较决定是否放入

你可能感兴趣的:(C语言简单算法例题,算法)