uva 624 CD

来源:互联网 发布:腾讯动漫源码 编辑:程序博客网 时间:2024/05/17 04:12

题目大意:

输入背包的容量和物品的个数,求尽可能装满背包的情况下获取的最大价值,并且输出价值;

解题思路:

0-1背包裸题,然后用另外一个数组存储每次取得最大值时候用到的物品,但要注意,样例中的输出是顺序的,因此我们需要把物品倒一下顺序即可;
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 10010int 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]);}}


0 0