最小重量和问题

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5, inf = 0x3f3f3f3f ;
int n, m, d;
struct node
{
    int v[maxn];
    int w[maxn];
}supplier[maxn];//商人结构体
int sup[maxn];//存储第几件商品找谁买
int tsup[maxn];//暂时存储第几件商品找谁买
int sum, weight;//价值,重量和
int flag = 0;//标志
bool ok(int x, int y, int ts, int tw)
{
    if(x <= m && x >= 0 && y <= n && y >= 0 && ts <= d)return true;
    else return false;
}//判断函数,确定能从这个人这里买
void fin(int x, int y, int ts, int tw)
{
    if(!ok(x,y,ts,tw)) return;//不能买退出
    tsup[y] = x;//第y件物品找x买
    if(y == n) {//第y件也买完即所有的物品都买了
        flag = 1;//标志为1,即true
        if(weight > tw) {//tw小于当前最优重量
            sum = ts, weight = tw;//更新
            for(int i = 1; i <= n; i++){sup[i] = tsup[i];}
        }
        return;
    }
    for(int i = 1; i <= m; i++){//继续搜索下一层
        fin(i,y+1,ts + supplier[i].v[y+1] ,tw + supplier[i].w[y+1]);
    }
}
int main()
{
    printf("请输入三个数,代表n,m,d,即部件数,供应商数目和最大价格\n");
    scanf("%d%d%d",&n,&m,&d);
    sum = d, weight = inf;
    printf("请输入相应的价格\n");
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            scanf("%d",&supplier[j].v[i]);
    printf("请输入相应的重量\n");
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            scanf("%d",&supplier[j].w[i]);
    fin(1,1,supplier[1].v[1] ,supplier[1].w[1]);//第i件物品找谁买
    cout<<weight<<endl;
    if(flag){
        for(int i = 1; i <= n; i++)
            cout<<sup[i]<<" ";
        cout<<endl;
    }
    else cout<<"No\n"<<endl;
}
/*
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值