CJOJ 2307 【一本通】完全背包(动态规划)

mac2022-06-30  17

CJOJ 2307 【一本通】完全背包(动态规划)

Description

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

Input

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ui,表示每个物品的重量和价值。

Output

仅一行,max=一个数,表示最大总价值。

Sample Input

10 4 2 1 3 3 4 5 7 9

Sample Output

max=12

Http

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2037

Source

动态规划

解决思路

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; }

转载于:https://www.cnblogs.com/SYCstudio/p/7137885.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)