01背包的变形,把时间看做花费和价值即可,同事记录路径即可,一开始以为在相同价值下要尽量多的选额track,最后测试了一下发现只要满足条件即可:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[100000];
int pt[100000];
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(cin>>n){
memset(dp,-1,sizeof(dp));
int num,t;
cin>>num;
dp[0]=0;pt[0]=0;
for(int i=1;i<=num;i++){
cin>>t;
for(int j=n-t;j>=0;j--) if(dp[j]!=-1){
if(dp[j]+t>dp[j+t]){
dp[j+t]=dp[j]+t;
pt[j+t]=t;
}
}
}
int ans=n;
while(dp[ans]==-1) ans--;
int path[25],size=0,p=ans;
while(p) {path[size++]=pt[p];p-=pt[p];}
for(int i=size-1;i>=0;i--)
cout<<path[i]<<" ";
cout<<"sum:"<<ans<<endl;
}
return 0;
}