hdu1963 完全背包(数据压缩)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1963
注意:题中有一句话说债券的价钱都是1000的倍数,我之前没看到这句话,写的完全背包,知道肯定是tle,然后用二进制优化还是tle,后来才发现忽略个条件。。。。
加上这个条件的话,这个就是个比较简单的完全背包了,具体见代码。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e5+5; const int INF=0x3f3f3f3f; int dp[maxn]; int w[15],p[15]; int main() { int T; scanf("%d",&T); while(T--) { int m,n,d; scanf("%d%d",&m,&n); scanf("%d",&d); for(int i=1; i<=d; i++) { scanf("%d%d",&w[i],&p[i]); w[i]/=1000; } for(int k=1; k<=n; k++) { memset(dp,0,sizeof(dp)); int ans=m/1000; for(int i=1; i<=d; i++) for(int j=w[i]; j<=ans; j++) dp[j]=max(dp[j],dp[j-w[i]]+p[i]); m+=dp[ans]; } printf("%d\n",m); } return 0; }