题目链接:点击打开链接
01背包,也是很水,模板
不过有个难点就是他还要记录,所以用一个数组记录一下
第一次写这样的题......
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
int dp[1010];
int num[1010];
int book[1010][1010];
int main(){
//freopen("in.txt","r",stdin);
int n,track;
while(cin>>n>>track){
memset(dp,0,sizeof(dp));
memset(book,0,sizeof(book));
for(int i=1;i<=track;i++) scanf("%d",&num[i]);
for(int i=1;i<=track;i++){
for(int j=n;j>=num[i];j--){
if(dp[j]<dp[j-num[i]]+num[i]){
dp[j]=dp[j-num[i]]+num[i];
book[i][j]=1;
}
else book[i][j]=0;
}
}
int m=n;
stack<int> st;
for(int i=n;i>=1;i--){
if(book[i][m]){
st.push(num[i]);
m-=num[i];
}
}
while(!st.empty()){
cout<<st.top()<<' ';
st.pop();
}
cout<<"sum:"<<dp[n]<<endl;
}
}