背包问题第四天打卡

本文介绍了解决背包问题的两种方法,一种是通过动态规划求出恰好达到特定价值的方案数,另一种则是通过贪心加01背包算法解决能量石问题。两篇代码示例详细展示了如何实现这些算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包问题求方案数

求出恰好为j的背包问题的价值,然后合计所以最大价值的方案数。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e3+10,mod = 1e9+7;
int f[N];
int g[N];
int main() {
    int n,m;
    cin>>n>>m;

    memset(f,-0x3f,sizeof f);
    f[0] = 0;//恰好为0
    g[0] = 1;
    for(int i = 0;i< n ;i++){
        int v,w;
        cin>>v>>w;
        for(int j = m;j>=v;j--){
            int maxv = max(f[j],f[j-v]+w);
            int cnt = 0;
            if(maxv == f[j]) cnt +=g[j];
            if(maxv == f[j-v]+w) cnt +=g[j-v];
            g[j] = cnt%mod;
            f[j] = maxv;
        }
    }

    int res = 0;
    for(int i = 0;i<=m;i++) res = max(res,f[i]);//最大价值
    int cnt = 0;
    for(int i= 0;i<=m;i++){//求最大价值的方案数之和
        if(res ==f[i])
            cnt = (cnt+g[i]) %mod;
    }
    cout<<cnt;


        return 0;
}

能量石

思路:贪心加01背包恰好dp,关键在于理解背包的体积和价值,

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 1e4+10,N = 1e2+10;
int f[M];
struct stone{
    int s,e,l;
    bool operator< (const stone w) const{
        return s*w.l<l*w.s;
    }
}s[N];

int main() {

    int T;
    cin>>T;
    for(int i = 1;i<=T;i++){

        int m = 0,n;
        cin>>n;
        for(int j = 1;j<=n;j++){
            scanf("%d%d%d",&s[j].s,&s[j].e,&s[j].l);
            m+=s[j].s;
        }

        sort(s+1,s+1+n);

        memset(f,-0x3f,sizeof f);
        f[0] =0;
        for(int j = 1;j<=n;j++){
            for(int k = m;k>=s[j].s;k--){
                f[k] = max(f[k],f[k-s[j].s]+s[j].e-(k-s[j].s)*s[j].l);
            }
        }

        int res = 0;

        for(int j = 1;j<=M;j++){
            res = max(res,f[j]);
        }

        printf("Case #%d: %d\n",i,res);

    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值