前言:
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
问题描述:
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
输入格式
第一行:两个整数,M(背包容量)和N(物品数量);
第2~N+1行:每行二个整数Wi、Ci,表示每个物品的重量和价值。
输出格式
仅一行,一个数,表示最大总价值。
样例输入
10 4
2 1
3 3
4 5
7 9
样例输出
max=12
问题提示
对于 30% 的数据:N<=200, M<=200 ;
对于 70% 的数据:N<=5000, M<=5000 ;
对于 100% 的数据:N<=10000, M<=10000, 0<=ci, wi <=1000
问题解析:
完全背包是01背包的稍微改动
需要考虑每个物品的价值和重量
用到动态规划
还是两道题分别是上一期的进阶
完整代码:
#include <bits/stdc++.h>
using namespace std;
int N,V;
int v[10010],val[10100];
int dp[10010];
int main()
{
cin>>V>>N;
for(int i=1; i<=N; i++)
{
cin>>v[i]>>val[i];
}
for(int i=1; i<=N; i++)
for(int j=0; j<=V; j++)
{
//dp[j]=dp[j];
if(j>=v[i])
{
dp[j]=max(dp[j],dp[j-v[i]]+val[i]);//转换方程
}
}
cout<<"max="<<dp[V];
return 0;
}