大二算法课实验课设(01背包贪心、dfs、bfs实现)

贪心

结构体排序,重载运算符即可

bool operator <(const node a)const{
	return a.weight < weight;
}
//
//  main.cpp
//  greedy_01
//
//  Created by 陈冉飞 on 2019/12/15.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

#include <iostream>
using namespace std;
#define maxn 10010
struct node{
    int w,v;
    double weight;
    bool operator < (const node a)const{return a.weight < weight;}
}a[maxn];
int n,wtotal,ans = 0;
#include <algorithm>

int main(int argc, const char * argv[]) {
    while (~scanf("%d%d",&n,&wtotal)) {
        for (int i = 0; i < n; i++) scanf("%d%d",&a[i].v,&a[i].w),a[i].weight = a[i].v*1.0/a[i].w;
        sort(a,a+n);
//        for (int i = 0; i < n; i++) printf("%lf ",a[i].weight);
        for (int i = 0; i < n && wtotal >= a[i].w; i++) {
            ans += a[i].v;
            wtotal -= a[i].w;
        }
        printf("%d\n",ans);
    }
    return 0;
}

dfs

//
//  main.cpp
//  dfs_01
//
//  Created by 陈冉飞 on 2019/12/15.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

#include <iostream>
using namespace std;
#define maxn 10010
int n,wtotal,w[maxn],v[maxn],ans = 0,tem = 0;
#include <cstring>
#define cl(a,b) memset(a,b,sizeof(a))

void dfs(int t){
    if (t == n) {
        if (tem > ans) ans = tem;
        return;
    }
    if (wtotal >= w[t]) {
        tem += v[t];wtotal -= w[t];
        dfs(t+1);
        tem -= v[t];wtotal += w[t];
    }
    dfs(t+1);
}

int main(int argc, const char * argv[]) {
    while (~scanf("%d%d",&n,&wtotal)) {
        //init
        cl(w,0);cl(v, 0);ans = 0;tem = 0;
        for (int i = 0; i < n; i++) scanf("%d%d",&v[i],&w[i]);
        dfs(0);
        printf("%d\n",ans);
    }
    return 0;
}

bfs

本来很简单的一个简单的bfs,但是由于马虎太菜了,debug半天就是没有发现输入的时候0-n写成了1-n,然后就一直少一组数据,然后gg。 开结构体放到队列中,通过队列取front来达到按层次遍历,然后通过index、wsum、vsum三个结构体中的属性分别记录索引(也是深度,用来判断时候应该跳出去判断)、到这个物品之前所占用的总空间、到这个物品之前的总价值

//
//  main.cpp
//  bfs_01
//
//  Created by 陈冉飞 on 2019/12/15.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

#include <iostream>
using namespace std;
#include <queue>
struct node{
    int index,wsum,vsum;
    node(int i,int w,int v):index(i),wsum(w),vsum(v){}
};
queue<node> q;
#define maxn 10010
int n,wtotal,w[maxn],v[maxn],ans = 0;

void bfs(){
    q.push(node(-1, 0, 0));
    int a = 1;
    while (!q.empty()) {
        if ((a ++) >=100 ) break;
        node temnode = q.front();
        q.pop();
        if (temnode.index == n-1 && ans < temnode.vsum) ans = temnode.vsum;
        if (temnode.index+1 < n) {
            if (temnode.wsum + w[temnode.index+1] <= wtotal) q.push(node(temnode.index+1,temnode.wsum+w[temnode.index+1], temnode.vsum+v[temnode.index+1]));
            //don't choose
            q.push(node(temnode.index+1,temnode.wsum,temnode.vsum));
        }
    }
}

int main(int argc, const char * argv[]) {
    while (~scanf("%d%d",&n,&wtotal)) {
        ans = 0;
        for (int i = 0; i < n; i++) scanf("%d%d",&v[i],&w[i]);
        bfs();
        printf("%d\n",ans);
    }
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值