《面试准备》c/c++最少装箱问题(动态规划)

问题描述:

出口质量不等的钻石n颗,至少需要多少个箱子?

输入:

一个整数m:箱子最大承载重量;

一个整数n:钻石的个数;

第i颗钻石的质量大小a[i];

输出:

最少需要多少箱子

举例:

输入:

10

5

4 5 7 3 6

输出:

3

c++代码实现(动态规划求解):

#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int i,j,k,l,n,m;
int a[1000],b[1000],c[1000];
int G[1000][1000];

void fun(int a[])
{
    int f[1000]={0};
    for(i=1;i<=n;i++) {
		for(j=m;j>=a[i];j--) {
            if (f[j] < f[j - a[i]] + a[i]){
                f[j] = f[j - a[i]] + a[i];
                G[i][j] = 1;
            }
		}
	}
}

void countminbag()
{
    int i = n;
    int j = m;
    while(i)
    {
        if (G[i][j] == 1)
        {
            /*if不满足,表示第i件物品没装入箱子,if条件满足,表示放入箱子了*/
            //cout<<i<<endl;
            j -= a[i];//此时重量减少
            a[i] = 0;
        }
        i--;
    }
}

int main()
{
    /**输入参数:
     * @param m 箱子最大承重
     * @param n 钻石个数
     * @param a[] 每个钻石的重量
     */
    int cntbag=0,sum=0;
    cout<<"输入背包容量"<<endl;
	cin>>m;
	cout<<"输入钻石个数"<<endl;
	cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
        sum += a[i];
    }
    while(sum){
        sum = 0;
        fun(a);
        countminbag();
        cntbag++;
        for(i=1;i<=n;i++)
            sum += a[i];
        //cout<<sum<<endl;
    }
    cout<<"最少背包数:"<<cntbag<<endl;
    return 0;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值