题目链接:http://acm.uestc.edu.cn/#/problem/show/1606
解法:
算法复杂度:O(N*K)
memset(dp,-1,sizeof(dp));
dp[0]=0;
饮用水:完全背包
for(j=b;j<=k;j++)
if (dp[j-b]!=-1) dp[j]=max(dp[j],dp[j-b]+a);
苏打水:01背包
for(j=k;j>=b;j–)
if (dp[j-b]!=-1) dp[j]=max(dp[j],dp[j-b]+a);
#include <bits/stdc++.h>
using namespace std;
const int maxn = 40010;
int n, k;
int dp[maxn], t[maxn], a[maxn], b[maxn];
int main()
{
scanf("%d %d", &n, &k);
for(int i=1; i<=n; i++){
scanf("%d %d %d", &t[i],&a[i],&b[i]);
}
memset(dp, 0, sizeof(dp));
for(int i=1; i<=n; i++){
if(t[i]==1){
for(int j=0; j<=k; j++){
if(j-b[i]>=0){
dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
}
}
}
else{
for(int j=k; j>=0; j--){
if(j-b[i]>=0){
dp[j]=max(dp[j], dp[j-b[i]]+a[i]);
}
}
}
}
printf("%d\n", dp[k]);
return 0;
}
本文通过一个具体的背包问题实例,讲解了如何使用01背包和完全背包算法解决物品选择问题。采用C++实现,展示了两种不同类型的背包问题求解过程及其代码实现细节。
1457

被折叠的 条评论
为什么被折叠?



