背包问题(snap)c++

该文章介绍了一个简单的背包问题,其中目标是选择物品以使总重量等于给定的背包容量。它提供了一段C++代码来解决这个问题,通过递归地尝试所有可能的物品组合来找到满足条件的解。如果找不到解决方案,则输出notfound。

 Background

Special for beginners, ^_^

Description

简单的背包问题。设有一个背包,可以放入的重量为s(1≤s≤100)。现有 n(1≤n≤10) 件物品,重量分别为 w1​,w2​…,wn​,(1≤i≤n) 均为正整数,从 n 件物品中挑选若干件,使得放入背包的重量之和正好为 s。找到一组解即可。

Format

Input

第一行是物品总件数和背包的载重量,第二行为各物品的重量。

Output

各所选物品的序号和重量,每件物品一行。

若无解,则输出 “not found”,输出不包括引号。

Samples

输入数据 1

5 10
1 2 3 4 5

输出数据 1

1 1
2 2
3 3
4 4

代码:

#include<bits/stdc++.h>
using namespace std;
int n,s,a[15],ans[15];
bool f(int b,int sum,int cnt)
{
    if(sum > s || cnt > n)
	{
		return false;
	}
    if(sum == s)
	{
        for(int i = 1; i <= cnt; i++)
		{
			cout<<ans[i]<<" "<<a[ans[i]]<<endl;
		}
		return true;
    }
    for(int i = b + 1; i <= n; i++)
	{
        ans[cnt + 1] = i;
        if(f(i,sum + a[i],cnt + 1))
		{
			return true;
		}
    }
    return false;
}
int main()
{
    cin>>n>>s;
    for(int i = 1; i <= n; i++)
	{
		cin>>a[i];
	}
    if(f(0,0,0) == false)
	{
		cout<<"not found";
	}
	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值