众所周知,龙龙十分喜欢逛中关村南门出去几百米远的那个五星超市。这天龙龙拉着 yds 一起去逛
五星超市,龙龙推着一个重量上限为 N 的购物车。他们在五星超市中逛了一圈也没看见什么想买的,购
物车里还是空的,这时龙龙突然发现后门附近还有一条长长的货物架,上面有 M 个商品,每个商品分别
有重量 G,和价值 S 两个属性,但这个购物架是单向的,也就是说龙龙只能从现在所处的这端走到另一
端将商品按顺序放入购物车中。龙龙说他可以轻松的将一些商品放入放入购物车中使得在购物车的重量
承受范围内,商品的总价值最大。但 yds 心想,这不就是一个简单的 01 背包问题?恶毒的yds 并不想让
龙龙简单的解决这个问题,他要求龙龙在只能按顺序放入商品之外,每次放入的商品的重量还必须小于
等于上一次放入的商品的重量。龙龙觉得这个问题就有点费脑筋了,他并不想去仔细思考,请你帮他算出
他在这样的规则下最多能往购物车里塞价值为多少的商品。
Input:
第一行输入两个整数 N, M,分别代表购物车的重量限制与商品的个数 (1 ≤ N ≤ 100, 1 ≤ M ≤ 100)
接下来 M 行,每行输入两个整数 Gi
, Si,分别代表第 i 个商品的重量与价值 (1 ≤ Gi
, Si ≤ 100)
Output:
输出一个整数 Sum,表示龙龙能够放入购物车中的做大的总价值数量。
一开始看着题以为是背包的题,后来听到其他同学说是可以用DFS做,于是试了试。无非就是拿与不拿一直递归下去,直到所有的商品都被访问完。
#include <iostream>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
#define ll long long
using namespace std;
const int maxn = 1e5+10;
int n,m;
int g[105],s[105];
int ans;
void dfs(int wei,int val,int pos,int pre)
{
if(pos>m)
{
ans = max(ans,val);
return;
}
if(wei+g[pos+1]<=n&&g[pos+1]<=pre)
dfs(wei+g[pos+1],val+s[pos+1],pos+1,g[pos+1]);
dfs(wei,val,pos+1,pre);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
scanf("%d%d",&g[i],&s[i]);
}
dfs(0,0,0,1005);
printf("%d\n",ans);
return 0;
}