题目链接:https://vjudge.net/contest/103424#problem/D
题目大意:
你要录制时间为N的带子,给你一张CD的不同时长的轨道,求总和不大于N的录制顺序
分析:
01背包问题,需要注意的是如何将路径输出。
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int dp[2001], tim[22]; int n; int main() { int t; while( scanf("%d",&n)!=EOF ) { scanf("%d",&t); int i,j; for( i=0; i<t; i++) scanf("%d",&tim[i]); memset( dp, -1, sizeof( dp)); //-1表示无法组成该数字 dp[0]=0; //先将0初始化 for( i=t-1; i>=0; i--) //逆序为了后面能正向打印方案 { for( j=n; j>=tim[i]; j--) if( dp[j-tim[i]]!=-1&& dp[j]==-1 ) //要求dp[j]==-1是如果已经有组成方案则不再更新,否则会出错 { dp[j] =tim[i]; //dp[i]的值为组成i的最后一个数字,这样方便后面打印出路径 } } while( dp[n]==-1) //找到能组成的最大数字 n--; int sum =n; while(n) //打印出路径 { printf("%d ",dp[n]); n-= dp[n]; } printf("sum:%d\n",sum); } return 0; }
2018-04-28