题意:往背包里装石头,使得背包的剩余空间最少.
第一行为背包容量,第二行为石头数量.
输入样例:
33
6
8
3
12
7
9
7
输出样例:
1
枚举:
thinking:每种石头放入背包的方法都尝试一遍,然后取容量-石头和重量的最小值(前提这个最小值大于0).
源代码:
#include <bits/stdc++.h>
8
using namespace std;
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int n,m;
int i,j,k;
cin >> n;
cin >> m;
int cap[m+1];
int f1[m+1];
int f2=1;
int min=999;
int sum;
memset(f1,0,sizeof(f1));
for( i=0;i<m;i++){
cin >> cap[i];
f2*=2;}
for(i=0;i<f2;i++){
for(j=0;j<m;j++)
if(f1[j]==0){
f1[j]=1;
continue;
}else{
f1[j]=0;
break;
}
sum=0;
for(k=0;k<m;k++)
if(f1[k]==1)sum+=cap[k];
//cout << sum<<endl;
if((n-sum)>=0&&(n-sum)<min)min=n-sum;
}
cout << min ;
return 0;
}
动态规划:
thinking:标准二维数组储存,然后从一个个石头开始算,每行的结果意思是到这块石头,这个容量能装的最大石头容量是多少,然后最后一行的最后一个就是装的最大容量.
样例输出:
0 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
0 0 0 3 3 3 3 3 8 8 8 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
0 0 0 3 3 3 3 3 8 8 8 11 12 12 12 15 15 15 15 15 20 20 20 23 23 23 23 23 23 23 23 23 23 23
0 0 0 3 3 3 3 7 8 8 10 11 12 12 12 15 15 15 18 19 20 20 22 23 23 23 23 27 27 27 30 30 30 30
0 0 0 3 3 3 3 7 8 9 10 11 12 12 12 15 16 17 18 19 20 21 22 23 24 24 24 27 28 29 30 31 32 32
0 0 0 3 3 3 3 7 8 9 10 11 12 12 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 32
源代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int n,m;
int i,j,k;
cin >> m;
cin >> n;
int cap[n+1];
int a[n+1][m+1];
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
cin >> cap[i];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(j>=cap[i])
a[i][j]=max(a[i-1][j],a[i-1][j-cap[i]]+cap[i]);
else
a[i][j]=a[i-1][j];
for(i=1;i<=n;i++){
for(j=0;j<=m;j++)
cout << a[i][j] << " ";
cout << endl;}
return 0;
}