当前位置: 首页 > 知识库问答 >
问题:

如何得到一个无界背包问题中使用的物品数?

谭浩皛
2023-03-14

我试图解决一个无界背包问题,但我卡住了。我已经解决了问题的主要部分,即获得最大值,但我还应该计算出为了获得最大值,我使用的每个项目的数量。
界限是小于100个项目和小于100个背包的容量。示例输入为
3(物品数量)
8(背包容量)
5 21(分别为重量和价值)
3 1
4 15

输出为
30(包可以容纳的最大值,是4个重量项目中的2个)
0 0 2(背包中每个项目有多少)

我不知道如何打印最后一行输出,我已经在这个问题上卡住了一个星期。我问了其他地方,他们说要存储我来自的前一个州,但我不确定如何做到这一点。这是我到目前为止的代码。任何帮助都很感激。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

int wt[101];
int val[101];
int ans[101];
int cnt[101];

int knapsack(int s, int N, int val[], int wt[]){
    
    for(int i=0;i<=s;i++){
        for(int j=0;j<N;j++){
            if(wt[j]<=i){
                int tmp = ans[i];
                ans[i] = max(ans[i], ans[i-wt[j]] + val[j]);
                
            }
        }
    }
    return ans[s];
}
int main() {
    
    int N, s, i, j, k, w, p;
    
    
    scanf("%d", &N);
    scanf("%d", &s);
    for(i=0;i<N;i++){
        scanf("%d %d", &wt[i], &val[i]);
    }
    
    printf("%d\n", knapsack(s, N, val, wt));
    
    
    
    
    return 0;
} 

共有1个答案

尤钱明
2023-03-14

我想你需要考虑一下你的基本组织。我不打算替你做作业,但我会试着给你一些提示。

你对背包问题的解释似乎有缺陷。让我确定我们有同样的问题。

你有一个背包(背包)。它最多可以容纳N“磅”。

如果你换一种想法,那就很有趣了。想象一下你在商店里赢得了一场购物狂欢。你可以装满购物车,你想尽可能地利用最大的价值。所以你去买最贵的东西,尽可能地把手推车装满,但当你快买完的时候,你就去买小东西,把角落塞满。

最后,你需要知道:

-手推车里的东西的总价值是多少-实际上是什么

class Item {
public:
     int weight;
     int value;
};
Item items[100];
for(index = 0; i < N; index++){
    Item & item = items[index];
    scanf("%d %d", &item.weight, &item.value);
}

我要谈一下一些文体方面的事情。首先,我不喜欢你的变量名。避免缩写很好。你会看到我把它们拼出来的。另外,单个字母的变量名很难搜索。你会看到我用的是index而不是I。代码中会有一百万个i实例,但没有那么多index实例。

另一个使代码更容易阅读的风格上的东西:空格。我们买得起。我不喜欢看到东西被塞在一起,因为我认为这会让阅读变得更加困难。不要害怕空间。

很明显,这两段是一种观点,所以要考虑它的价值。

当它回来时,is看到,“哦,加1比不加1会给我一个更好的总价值,所以这是我暂定的最佳解决方案。”

您循环检查,直到您使用了所有8个插槽,只有第一个项目,找出什么是最好的。

编写代码很棘手,可能需要一点时间,但这是解决这个问题的一种方法。将结果存储在另一个类中,然后打印就很容易了。

 类似资料:
  • 到目前为止,我的想法是生成一个超重的背包,然后递归地向后工作,一次替换一个项目,直到它<=最大重量。对于生成最优背包来说,这不是一个问题,然而,我真的想生成以下100个左右的背包。我想我可以通过继续我的递归过程来做到这一点,然而,我觉得这并不完全准确,因为a可能缺少稍微更优化的背包。

  • 问题内容: 我有一个博客。在单个帖子页面上,我想显示指向上一个帖子的链接,如果有一个链接,则在底部发布下一个帖子。该链接应为特定帖子的标题。 我如何用猫鼬最简单的方式做到这一点? 我当前的控制器如下所示: 架构如下所示: 问题答案: 因此,假设您拥有这样的架构: 我想_id是mongo ObjectId,所以我们包含发布日期,我可以对其进行排序 让我们考虑一下,我已经打开了ID为的当前帖子(而不是

  • 虽然标准背包问题可以通过动态规划来解决,但我试图稍微扭曲一下这个问题,以明确我的概念,但我发现它可能比我想象的更难。 最初的背包问题是,给定一个大小为的背包,以及一个重量为且值为的物品列表,找出总价值最高的背包中适合的物品子集。 据我所知,这可以通过动态规划实现,其中是项目数。 现在,如果我尝试添加约束,它们中的每一个都是一对只能相互独占地拾取的项目(即,如果存在项目a和项目B的约束,那么我只能选

  • 我一直在使用这种动态编程的变体来解决背包问题: 这对于上面的结构非常有效,您只需提供名称、成本和价值。可以像这样创建项目: 现在,我面临的问题是,我需要为每个玩家添加一个位置,我必须让背包算法知道,它仍然需要在所有玩家中最大化价值,除了有一个新的限制,该限制是每个玩家都有一个位置,每个位置只能被选择一定的次数。有些职位可以选择两次,有些职位可以选择一次。理想情况下,物品应为: 职位将受到以下限制:

  • 我想用for循环写一个代码,但我无法得到背后的逻辑。有人能帮助我在这个代码问题:问题的图片

  • 主要内容:动态规划解决01背包问题,01背包问题的具体实现商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品。装哪些商品才能获得最大的收益呢?在限定条件内找到最佳的物品组合,这样的问题统称为背包问题。 根据限定的条件不同,背包问题还可以细分: 部分背包问题:所有物品是可再分的,即允许将某件物品的一部分(例如 1/3)放入背包; 0-1 背包问题:所有物品不可再分,要么整个装入背包,要么放弃,不允许出现“仅选择物品