题目:https://www.luogu.org/problem/P1049(偷个懒,不把题目粘上去了好)
分析
这道题看似是一个背包,其实没必要那么麻烦。我们定义一个f数组,枚举这些物品可以组合出的所有体积。最后从体积为m往前遍历,输出第一个能组合出来的体积与总容量的差。代码如下。
#include <bits/stdc++.h> using namespace std; int n,m,a[105]; bool f[20005]; //f记录每个体积 int main() { cin>>m>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { int tmp[10005]; for(int l=0;l<=m;l++) tmp[l]=f[l]; //我们不能直接用f更新f,因为会出现一个物品使用两次的情况 f[a[i]]=1; for(int j=1;j<=m;j++) { if(tmp[j]!=0 && j+a[i]<=m) f[j+a[i]]=1; //更新 } } for(int i=m;i>=0;i--) { if(f[i]) { cout<<m-i; //输出第一个能组合出来的体积与总容量的差 break; } } return 0; }