动态规划之背包九讲

背包九讲

背包九讲链接:https://www.cnblogs.com/jbelial/articles/2116074.html

01背包:

题目链接:https://www.acwing.com/problem/content/2/

二维数组优化前:

 1 #include <iostream>
 2 
 3 
 4 
 5 using namespace std;
 6 
 7 const int N = 1e3 + 10;
 8 int v[N], w[N];
 9 int f[N][N];
10 
11 int main() {
12     int N, V;
13     cin >> N >> V;
14     for (int i = 1; i <= N; i++)    cin >> v[i] >> w[i];
15     for (int i = 1; i <= N; i++) {
16         for (int j = 1; j <= V; j++) {
17             f[i][j] = f[i - 1][j];
18             if (j >= v[i])  f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
19         }
20     }
21     cout << f[N][V] << endl;
22     return 0;
23 }
View Code

优化后:

#include <iostream>
#include <algorithm>


using namespace std;

const int N = 1e3 + 10;
int v[N], w[N];
int f[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 = V; j >= v[i]; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[V] << endl;
    return 0;
}
View Code

完全背包:

题目链接:https://www.acwing.com/problem/content/3/

优化前:

#include <iostream>


using namespace std;

const int maxn = 1e3 + 10;
int v[maxn], w[maxn];
int f[maxn][maxn];

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++) {
            f[i][j] = f[i - 1][j];
            if (j >= v[i])   f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
        }
    cout << f[N][V] << endl;
    return 0;
}
View Code

优化后:

#include <iostream>


using namespace std;

const int N = 1e3 + 10;
int v[N], w[N];
int f[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 (j >= v[i])  f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[V] << endl;
    return 0;
}
View Code

多重背包:

题目链接:https://www.acwing.com/problem/content/4/

数据范围小,不用优化:

#include <iostream>


using namespace std;

const int N = 1e2 + 10;
int v[N], w[N], s[N];
int f[N];

int main() {
    int n, V;
    cin >> n >> V;
    for (int i = 1; i <= n; i++)    cin >> v[i] >> w[i] >> s[i];
    for (int i = 1; i <= n; i++)
        for (int j = V; j >= 0; j--)
            for (int k = 1; k <= s[i] && k * v[i] <= j; k++)
                f[j] = max(f[j], f[j - k * v[i]] + k * w[i]);
    cout << f[V] << endl;
    return 0;
}
View Code

数据范围大,二进制优化版:https://www.acwing.com/problem/content/5/

把每个物品拆开

 1 #include <iostream>
 2 
 3 
 4 using namespace std;
 5 
 6 const int N = 25000;
 7 int v[N], w[N];
 8 int f[N];
 9 
10 int main() {
11     int n, V;
12     cin >> n >> V;
13     int cnt = 0;
14     for (int i = 1; i <= n; i++) {
15         int a, b, s;
16         cin >> a >> b >> s;
17         int k = 1;
18         while (k <= s) {
19             cnt++;
20             v[cnt] = a * k;
21             w[cnt] = b * k;
22             s -= k;
23             k *= 2;
24         }
25         if (s > 0) {
26             cnt++;
27             v[cnt] = a * s;
28             w[cnt] = b * s;
29         }
30     }
31     n = cnt;            //因为这句话WA了
32     for (int i = 1; i <= n; i++)
33         for (int j = V; j >= v[i]; j--)
34             f[j] = max(f[j], f[j - v[i]] + w[i]);
35     cout << f[V] << endl;            
36 }
View Code

 

转载于:https://www.cnblogs.com/DreamInPal/p/11560782.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值