hihocoder 01背包(动态规划)

hihocoder上面这道01背包是最基础的题我觉得,没有什么变化,这是题目的链接点击打开,就是找到每个变量所对应的经典问题中的变量就可以大笑,上学期看过背包问题,上面的代码也抄了下来,感觉可以做模板了微笑,下面一

下思路设一个二维数组dp[i+1][j]表示从前 i 个奖品中选出不超过m的奖券时总价值的最大值,那么把dp[0][j]都初始化为0,然后找出一个递推关系        |dp[i][j] (j<w[i])

dp[i+1][j]=|max(dp[i][j],dp[i][j-w[i]]+v[i])(其它)

所以说这道题很容易就可以解出来了,w[i]存的是每一个奖品需要的奖券,v[i]存的是每一个奖品的价值,其中第一种情况意思是不选第i个奖品,直接等于前i-1个的价值;第二种情况是选择第i件奖品

01背包其实理解了也挺简单的,找出关系式就可以了。今天有比赛,选拔去参加省赛,估计结果不咋地,有大三的参加,上次选拔赛就做的不咋地,其实上次题挺简单的,我输在了心态上,其实现在想想也没啥可激动的,过就过了,不过就继续想呗,心态一直是我的弱点,一直都在努力克服,每一次比赛我都会进步一点点,争取让自己的弱项变为最强大的地方奋斗,好了,今天的比赛慢慢做吧,能做多少是多少微笑

贴代码:

#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
int dp[505][100005];
int w[505],v[505];
int max(int m,int n)
{
	return m>n?m:n;
}
void solve(int n,int m)
{
	int i,j;
	for(i=0;i<=m;i++)
		dp[0][i]=0;
	for(i=0; i<n; i++)
		for(j=0; j<=m; j++)
		{
			if(j<w[i])
				dp[i+1][j]=dp[i][j];
			else
				dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
		}
		printf("%d",dp[n][m]);
}
int main()
{
	int n,m,i;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
			scanf("%d%d",&w[i],&v[i]);
	solve(n,m);
	return 0;
} 

  




你可能感兴趣的:(hihocoder 01背包(动态规划))