问题描述:
出口质量不等的钻石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;
}