分析:dp[i][j]表示前i个数,组成j,最少需要多少个。dp[i][j]=min(dp[i-1][j],dp[i-1][j-k*v[i]]+k),则可以转化为完全背包问题,同样的方法进行降维处理即可。
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=2e6+100; 7 const int INF=1<<30; 8 int K,n; 9 int dp[maxn],v[100]; 10 int main() 11 { 12 cin>>K>>n; 13 int ans=0; 14 for(int i=1;i<=n;i++){ 15 cin>>v[i]; 16 ans=max(ans,v[i]); 17 } 18 int m=2e6; 19 for(int i=1;i<=m;i++) 20 dp[i]=INF; 21 for(int i=1;i<=n;i++){ 22 for(int j=v[i];j<=m;j++){ 23 dp[j]=min(dp[j],dp[j-v[i]]+1); 24 } 25 } 26 int res=1; 27 for(int i=1;i<=m;i++){ 28 if(dp[i]>K){ 29 res=i; break; 30 } 31 } 32 cout<<res-1<<endl; 33 }