把dp的维数写反了,看了半天我吐了。
#include<bits/stdc++.h>
using namespace std;
int dp[31][20001],num[31];//dp[i][j]=1表示前i个物品放入可以产生剩余空间j
int v,n,ans;
int main() {
cin>>v>>n;
for(int i=1; i<=n; i++) cin>>num[i];
memset(dp,0,sizeof(dp));
dp[0][v]=1;
for(int i=1; i<=n; i++) {
for(int j=v; j>=0; j--) {
if(dp[i-1][j]==1) {
dp[i][j]=1;
if(j-num[i]>=0) dp[i][j-num[i]]=1;
}
}
}
for(int j=0; j<=v; j++) {
if(dp[n][j]==1){
cout<<j;
return 0;
}
}
}