其他分享
首页 > 其他分享> > 差分约束,背包问题

差分约束,背包问题

作者:互联网

差分约束,求最大值跑最短路,求最小值跑最长路,

最长路 xi-xj>=k添加j到i的权值为k的边

最短路xi-xj<=k添加j到i的权值为k的边

超级源点,到所有的点权值为0

注意用spfa跑时还要注意是否有负环


背包问题:

01背包

 1 int w[N], v[N];
 2 int f[N];
 3 int main() {
 4     int n, m;
 5     cin >> n >> m;
 6     for (int i = 1; i <= n; ++i)
 7         cin >> w[i] >> v[i];
 8     for (int i = 1; i <= n; ++i) {
 9         for (int j = m; j >= v[i]; --j)//从大往小表示单选
10             f[j] = max(f[j], f[j - v[i]] + w[i]);
11     }
12     cout << f[m] << endl;
13     return 0;
14 }

完全背包

int w[N], v[N];
int f[N];
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> w[i] >> v[i];
    for (int i = 1; i <= n; ++i) {
        for (int j = v[i]; j >= m; ++j)//从小往大表示多选
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    }
    cout << f[m] << endl;
    return 0;
}

多重背包

将他变成多个01背包问题求解就行

标签:xj,背包,cout,int,cin,差分,约束,xi
来源: https://www.cnblogs.com/xuanru/p/16495720.html