完全背包问题
2018-03-09 19:52
253 查看
一个背包总容量为V,现在有N个物品,第i个 物品体积为weight[i],价值为value[i],每个物品都有无限多件,现在往背包里面装东西,怎么装能使背包的内物品价值最大?
分析:
完全背包问题中,物品无限多件,只要背包没满,就可以一直添加
状态转移方程为:
f[i][j] = max(f[i-1][j-k*weight[i]] +k*value[i]) 其中 0<=k<= v / weight[i]
当然 可以优化 使用一维数组
for i = 1......n
forj = 1.....m
f[j] = max(f[j],f[j-weight[i]] + value[i])
贴代码、
#include<bits/stdc++.h>
using namespace std;
int w[10],v[10],dp[105];
int main()
{
int m,n;//m为 容量 n为物品种类
cin >> m >> n;
for(int i = 1;i <= n;i ++)
cin >> w[i] >> v[i];
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++)
if(j >= w[i])
dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
}
cout << dp[m];
return 0;
}
分析:
完全背包问题中,物品无限多件,只要背包没满,就可以一直添加
状态转移方程为:
f[i][j] = max(f[i-1][j-k*weight[i]] +k*value[i]) 其中 0<=k<= v / weight[i]
当然 可以优化 使用一维数组
for i = 1......n
forj = 1.....m
f[j] = max(f[j],f[j-weight[i]] + value[i])
贴代码、
#include<bits/stdc++.h>
using namespace std;
int w[10],v[10],dp[105];
int main()
{
int m,n;//m为 容量 n为物品种类
cin >> m >> n;
for(int i = 1;i <= n;i ++)
cin >> w[i] >> v[i];
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++)
if(j >= w[i])
dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
}
cout << dp[m];
return 0;
}
相关文章推荐
- 题目1454:Piggy-Bank 完全背包问题
- 【背包专题】H - 钱币兑换问题 hdu1284【完全背包】
- 背包问题:01背包与完全背包
- P02: 完全背包问题
- 动态规划之01背包、完全背包问题
- 模板①:背包问题(0-1背包&完全背包&多重背包)
- 完全背包问题
- 0-1背包问题与完全背包问题C++实现 动态规划
- 完全背包问题UVA147
- 01背包与完全背包问题
- 杭电OJ 1248 完全背包问题 及反思
- 完全背包问题
- 经典问题之01与完全背包总结
- 动态规划-完全背包问题
- 完全背包+最值问题
- 完全背包问题
- piggy-bank 完全背包问题
- [JZOJ4916]完全背包问题
- 0-1背包和完全背包问题
- hdu 1114 Piggy-Bank 完全背包问题