0
点赞
收藏
分享

微信扫一扫

2022.1.12学习总结

十里一走马 2022-01-13 阅读 14

目录

01背包问题

已知条件

需要满足两个条件

确定状态转移方程


终于终于看懂了01背包问题,总耗n小时,现在来总结一下吧!

01背包问题

已知条件

①有N个物品,有一个背包。背包的容量是V。

②对于每个物品:体积,价值

③每个物品只能使用一一


需要满足两个条件


①选择的这i个物品总体积不超过V
②这些物品的价值加起来最大
③对于某一个物品:使用/不使用
 

确定状态转移方程


dp[illjl的含义:

从下标为[1-i]的物品里任意取,放进容量为i的背包,价值总和最大是多少。

(首先,当背包里没有第i件物品的时候,此时背包里面物品的最大价值就是第i件物品之前的物品的价值总和。
记作dp[i][j]=dp[i-1][j];)


(当可以放进第i件物品的时候,此时最大价值应该是背包容量减去物品i的容量之后的剩余容量能放的物品价值加上物品的价值。
记作dp[i-1][j-weight[i]]+value[i];这时最优解在dp[i]li]取到)

写的超级详细了吧!!看代码吧!

#include<stdio.h>
int dp[1000][1000];
int n,V;
int v[1000],w[1000];//体积,价值
int main()
{
	
	scanf("%d%d",&n,&V);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&v[i],&w[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=V;j++)
		{
			if(dp[i][j]>=dp[i-1][j])
				dp[i][j]=dp[i][j];
			else
				dp[i][j]=dp[i-1][j];
			if(j>=v[i])
			{
				if(dp[i][j]>=dp[i-1][j-v[i]]+w[i])
					dp[i][j]=dp[i][j];
				else
					dp[i][j]=dp[i-1][j-v[i]]+w[i];
			}			
		}
		printf("%d",dp[n][V]);
		return 0;
	}
}

刷了一道相关题目,还存在一些bug,明天再改吧!!

举报

相关推荐

2022.1.12

2022.1.12Java_面向对象_3

学习总结。。。。

学习总结!

FineBI学习总结

2022.1.20 学习总结

近日学习总结

0 条评论