原题地址(洛谷)
这道题我用的是动态规划,一个递归就能解决。其实基本思路就是选与不选两个选项,哪个答案小返回哪个。核心代码就这些,我在里面注释了详细的解释。
int box(int t,int r){
int x,y; //定义两个变量,表示两个比较的量
if(t>n)return r; //如果下标比总物品数大,则返回r
if(r-a[t]<0)return s(t+1,r);//如果下标所在的物品的值比0小,则跳到下一个
x=s(t+1,r-a[t]); //第一个x表示选
y=s(t+1,r); //第二个y表示不选
if(x<y)return x; //比较两个数的大小,如果x小则返回x
else return y; //如果y小则返回y
}
下面奉上代码。
#include <bits/stdc++.h>
using namespace std;
int a[1000],v,n;
int box(int t,int r){
int x,y;
if(t>n)return r;
if(r-a[t]<0)return s(t+1,r);
if(r-a[t]==0)return r-a[t];
x=s(t+1,r-a[t]);
y=s(t+1,r);
if(x<y)return x;
else return y;
}
int main(){
cin>>v>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cout<<box(1,v);
return 0;
}