文章
166
粉丝
68
获赞
829
访问
51.4k
适配背包问题有两种,第一种就是这种,不存在最优结果的适配问题,也就是我们只考虑能否放下的可能性是否存在,但是不考虑价值,第二种就是考虑价值的。
对于第一种的解法,其实很简单,我们只需要利用布尔型的背包解决即可,全部的情况就只有这几种,当前物品对于当前背包大小,能放入,则判定,这时候不需要判定是否放入,因为不放入必然是不可能适配的,放入,则判定是否收缩前是适配的状态,假如大小不足,无法放入,则直接取上一个物品该大小的情况即可,最后的方程如下
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;
}
}
对于另一个问题,只需要在这种分析的基础上,改一下就行了,我们需要最大价值,先判定是否是完美放入,再进行价值收缩
登录后发布评论
暂无评论,来抢沙发