首页 > 代码库 > NYOJ311完全背包
NYOJ311完全背包
题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=311
思路:题目很明显的写出了这是一个完全背包的问题所以状态转移方程很好得出来
dp[j] = max(dp[j],dp[j - c] + w)
可有一个问题很需要注意题目中说道体积必须正好是V所以我们要在初始化dp的时候来限制这个条件
我们可以用memset(dp,-∞,sizeof(dp))来限制这个条件
为什么呢 比如你想求dp[3] 如果第三个物品的重量是2 那么你如果想知道dp[3]的最大值你必须
知道dp[1],如果dp[1]为-∞的时候说明没有能和2相加正好到3的所以2这个物品不能用 其他物品同理 这样一来
就可以既满足 体积正好为V还是最大的了 下面看代码:
#include<stdio.h>#include<string.h>int dp[50005];int main(){ int t,m,n,i,j,v; int c,w; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&v); memset(dp,-100,sizeof(dp));dp[0] = 0; for(i = 0;i < m;i++) { scanf("%d%d",&c,&w); for(j = c;j <= v;j++)//这个地方一定要注意j初始化为c如果为0 下面求dp[j] 就得用max了 { if(dp[j - c] + w > dp[j]) { dp[j] = dp[j - c] + w; } else { dp[j] = dp[j]; } } } if(dp[v] < 0)printf("NO\n"); else printf("%d\n",dp[v]); } return 0;}
NYOJ311完全背包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。