01背包
#include<iostream>
using namespace std;
int dp[100][1010];
int vi[1000], wi[10000];//第 i 件物品的体积是 vi,价值是 wi
int main()
{
int N, V;//N 件物品,背包容量V,每件物品只能使用一次。
cin >> N >> V;
for (int i = 1; i <= N; i++)
{
cin >> vi[i] >> wi[i];
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= V; j++)
{
if (j < vi[i])
{
dp[i][j] = dp[i - 1][j];
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - vi[i]] + wi[i]);
}
}
}
cout << dp[N][V];
return 0;
}
/*
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例
8
输入样例
4 10
2 1
3 3
4 5
7 9
输出样例
12
*/
01背包优化
#include<iostream>
using namespace std;
int dp[1010];
int vi[1000], wi[10000];//第 i 件物品的体积是 vi,价值是 wi
int main()
{
int N, V;//N 件物品,背包容量V,每件物品只能使用一次。
cin >> N >> V;
for (int i = 1; i <= N; i++)
{
cin >> vi[i] >> wi[i];
}
for (int i = 1; i <= N; i++)
{
for (int j = V; j >= 1; j--)
{
if (j >= vi[i])
{
dp[j] = max(dp[j], dp[j - vi[i]] + wi[i]);
}
}
}
cout << dp[V];
return 0;
}
/*
1.输入样例
4 5
1 2
2 4
3 4
4 5
1.输出样例
8
2.输入样例
4 10
2 1
3 3
4 5
7 9
2.输出样例
12
*/
完全背包
#include <iostream>
using namespace std;
int N,V;
int dp[1010];
int main ()
{
cin >> N >> V;
for (int i = 1;i <= N;i++)
{
int vi,wi;
cin >> vi >> wi;
for (int j = vi;j <= V;j++)
{
dp[j] = max (dp[j],dp[j - vi] + wi);
}
}
cout << dp[V] << endl;
return 0;
}
#include<iostream>
using namespace std;
int dp[1010];
int vi[1000], wi[10000];//第 i 件物品的体积是 vi,价值是 wi
int main()
{
int N, V;//N 件物品,背包容量V,每件物品能使用多次。
cin >> N >> V;
for (int i = 1; i <= N; i++)
{
cin >> vi[i] >> wi[i];
}
for (int i = 1; i <= N; i++)
{
for (int j = V; j >= 1; j--)
{
for (int k = 0; k <= j / vi[i]; k++)
{
if (j >= vi[i])
{
dp[j] = max(dp[j], dp[j - k*vi[i]] + k*wi[i]);
}
}
}
}
cout << dp[V];
return 0;
}
/*
1.输入样例
4 5
1 2
2 4
3 4
4 5
1.输出样例
10
2.输入样例
4 10
2 1
3 3
4 5
7 9
2.输出样例
12
*/
完全背包优化
#include<iostream>
using namespace std;
int dp[1010];
int vi[1000], wi[10000];//第 i 件物品的体积是 vi,价值是 wi
int main()
{
int N, V;//N 件物品,背包容量V,每件物品能使用多次。
cin >> N >> V;
for (int i = 1; i <= N; i++)
{
cin >> vi[i] >> wi[i];
}
for (int i = 1; i <= N; i++)
{
for (int j = vi[i]; j <= V; j++)//顺向
{
if (j >= vi[i])
{
dp[j] = max(dp[j], dp[j - vi[i]] + wi[i]);
}
}
}
cout << dp[V];
return 0;
}
/*
1.输入样例
4 5
1 2
2 4
3 4
4 5
1.输出样例
10
2.输入样例
4 10
2 1
3 3
4 5
7 9
2.输出样例
12
*/