题目大意:
输入背包的容量和物品的个数,求尽可能装满背包的情况下获取的最大价值,并且输出价值;
解题思路:
0-1背包裸题,然后用另外一个数组存储每次取得最大值时候用到的物品,但要注意,样例中的输出是顺序的,因此我们需要把物品倒一下顺序即可;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 10010
int main()
{
int v,n;
while(~scanf("%d%d",&v,&n))
{
int cost[110];
int dp[maxn]={0};
int used[maxn];
memset(used,-1,sizeof(used));
for(int i=0;i<n;i++)
scanf("%d",&cost[i]);
for(int i=n-1;i>=0;i--)
{
for(int j=v;j>=cost[i];j--)
{
if(dp[j-cost[i]]+cost[i]>dp[j])
{
dp[j]=dp[j-cost[i]]+cost[i];
used[j]=cost[i];
}
}
}
int t=dp[v];
while(used[t]!=-1)
{
printf("%d ",used[t]);
t-=used[t];
}
printf("sum:%d\n",dp[v]);
}
}