有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi, wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输入样例 输出样例 10
4 5
1 2
2 4
3 4
4 5
1.
#include<iostream>
using namespace std;
const int N = 1010;
int f[N][N];
int v[N],w[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1 ; i <= n ;i ++)
{
cin>>v[i]>>w[i];
}
for(int i = 1 ; i<=n ;i++)
for(int j = 0 ; j<=m ;j++)
{
for(int k = 0 ; k*v[i]<=j ; k++)
f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
cout<<f[n][m]<<endl;
}
容易超时
2.
#include <iostream>
using namespace std;
int v[1005]; //体积
int w[1005]; //价值
int f[1005][1005];
int main ()
{
int N,V;
cin >> N >> V;
for(int i=1;i<=N;i++)
{
cin >> v[i] >> w[i];
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=V;j++)
{
if(v[i]>j)
{
f[i][j]=f[i-1][j];
}
else
{
int t=max(f[i-1][j-v[i]]+w[i],f[i-1][j]); //将三种情况进行比较(选下一个,不选下一个,还选这个)
f[i][j]=max(t,f[i][j-v[i]]+w[i]);
}
}
}
cout << f[N][V] << endl;
return 0;
}
3.第一种的优化
#include <iostream>
using namespace std;
const int n=1005;
int f[n][n];
int v[n];
int w[n];
int main ()
{
int N,V;
cin >> N >> V;
for(int i=1;i<=N;i++)
{
cin >> v[i] >> w[i];
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=V;j++)
{
if(v[i]>j)
{
f[i][j]=f[i-1][j];
}
else
{
f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
}
}
}
cout << f[N][V] << endl;
return 0;
}

本文探讨了无限背包问题的解决方法,给出了三种不同的实现方案,并针对第一种方案进行了优化。介绍了如何通过动态规划来确定在有限背包容量下,如何选择物品以达到价值最大化。
5627

被折叠的 条评论
为什么被折叠?



