文章

166

粉丝

68

获赞

829

访问

51.4k

头像
小偷的背包 题解:详细解释一下适配背包问题
P1123 中国科学技术大学机试题
发布于2025年1月31日 09:45
阅读数 479

适配背包问题有两种,第一种就是这种,不存在最优结果的适配问题,也就是我们只考虑能否放下的可能性是否存在,但是不考虑价值,第二种就是考虑价值的。

对于第一种的解法,其实很简单,我们只需要利用布尔型的背包解决即可,全部的情况就只有这几种,当前物品对于当前背包大小,能放入,则判定,这时候不需要判定是否放入,因为不放入必然是不可能适配的,放入,则判定是否收缩前是适配的状态,假如大小不足,无法放入,则直接取上一个物品该大小的情况即可,最后的方程如下

 

dp[i][j] = dp[i−1][j−w[i−1] (​ if j≥w[i−1] ) otherwise​ =dp[i-1][j];

#include <bits/stdc++.h>
using namespace std;

int main(){
    int s,n;
    while(cin>>s>>n){
        bool dp[n+1][s+1];
        memset(dp,false,sizeof(dp));
        dp[0][0]=true;
        for(int i=1;i<=n;i++){
            int x;cin>>x;
            for(int j=0;j<=s;j++){
                if(j>=x)dp[i][j]=dp[i-1][j-x];
                else dp[i][j]=dp[i-1][j];
            }
        }
        if(dp[n][s]==true)cout<<"yes!"<<endl;
        else cout<<"no!"<<endl;
    }
}

对于另一个问题,只需要在这种分析的基础上,改一下就行了,我们需要最大价值,先判定是否是完美放入,再进行价值收缩

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发