#include<iostream>
using namespace std;
int func(int amount,int cnt,int *stamp){
int dp[cnt+1][amount+1];
for(int i=0;i<=cnt;i++){
for(int j=0;j<=amount;j++){
if(j==0){
dp[i][j]=0;
}
else{
dp[i][j]=-1;
}
}
}
for(int i=1;i<=cnt;i++){
for(int j=stamp[i];j<=amount;j++){
if(dp[i-1][j-stamp[i]]!=-1 && dp[i-1][j]!=-1){
dp[i][j]=min(dp[i-1][j-stamp[i]]+1,dp[i-1][j]);
}
else if(dp[i-1][j-stamp[i]]!=-1){
dp[i][j]=dp[i-1][j-stamp[i]]+1;
}
else if(dp[i-1][j]!=-1){
dp[i][j]=dp[i-1][j];
}
}
for(int x=0;x<=cnt;x++){
for(int y=0;y<=amount;y++){
cout<<dp[x][y]<<" ";
}
cout<<endl;
}
cout<<"i"<<i<<endl;
}
if(dp[cnt][amount]!=-1){
return dp[cnt][amount];
}
else{
return 0;
}
}
int main(){
int m;
while(cin>>m){
int n;
cin>>n;
int stamp[n+1];
for(int i=1;i<=n;i++){
cin>>stamp[i];
}
int ret=func(m,n,stamp);
cout<<ret<<endl;
}
return 0;
}
背包问题
最新推荐文章于 2021-05-07 08:08:56 发布