CJOJ 2307 【一本通】完全背包(动态规划)
2017-07-08 20:21
246 查看
CJOJ 2307 【一本通】完全背包(动态规划)
Description
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。Input
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);第2..N+1行:每行二个整数Wi,Ui,表示每个物品的重量和价值。
Output
仅一行,max=一个数,表示最大总价值。Sample Input
10 42 1
3 3
4 5
7 9
Sample Output
max=12Http
CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2037Source
动态规划解决思路
a设F[i][j]表示前i件物品重量为j时的最大价值,所以有F[i][j]=max(F[i-1][j],F[i-1][j-V[i]]+W[i])
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxN=1000; const int maxM=300; const int inf=2147483647; class Item { public: int weight,value; }; int n,M; vector<Item> I; int F[maxN][maxM]={0}; int main() { int a,b; cin>>M>>n; I.push_back((Item){0,0}); for (int i=1;i<=n;i++) { cin>>a>>b; int k=M/a; for (int j=1;j<=k;j++) I.push_back((Item){a,b}); } int Ans=0; for (int i=1;i<I.size();i++) { for (int j=1;j<=M;j++) { if (j-I[i].weight>=0) F[i][j]=max(F[i-1][j],F[i-1][j-I[i].weight]+I[i].value); else F[i][j]=F[i-1][j]; Ans=max(Ans,F[i][j]); //cout<<F[i][j]<<' '; } //cout<<endl; } cout<<"max="<<Ans<<endl; return 0; }
相关文章推荐
- CJOJ 2307 【一本通】完全背包
- CJOJ 2040 【一本通】分组背包(动态规划)
- 动态规划—完全背包
- 【动态规划】完全背包
- [置顶] 【动态规划】完全背包、多重背包
- 完全背包(动态规划)
- HDU 1114 Piggy-Bank 动态规划完全背包
- HDOJ 1114 Piggy-Bank 【动态规划 完全背包】
- 动态规划 杭电1171 0-1背包和完全背包结合
- 完全背包(动态规划)
- 动态规划 杭电1171 0-1背包和完全背包结合
- 动态规划(完全背包的变形)
- 动态规划第二讲——完全背包与多重背包问题
- 动态规划(01背包、完全背包、多重部分和、LCS、LIS、划分数、多重集组合数)
- 动态规划(2)-完全背包【模板】
- POJ1384-动态规划02完全背包
- ZOJ 3623 Battle Ships 造战舰炸塔 动态规划 伪装较好的完全背包 ★★★
- 夕拾算法进阶篇:20)货币系统 (完全背包_动态规划DP)
- tyvj p1015公路乘车-动态规划dp-完全背包
- 0-1背包问题与完全背包问题C++实现 动态规划