终于开始做自己一直不敢碰的dp了,内心颇不平静。很久以前看过的背包九讲也没什么印象了。这个题错了四次。之前老师有说过看到dp不要把它想成dp,要按照数学归纳的路子来。先来个最初的归纳假设,如果过弱再加强归纳假设,如果过强,则在松一些。说服自己尽量这么干,毕竟刚开始真的会比较困难。要找到最初的归纳假设就相当困难,何况加强或者松弛,于我,比较难。
写着题时脑子里面一直恍恍惚惚的,恐惧心理已经完全打败了我。四次错在v不是从0开始,哎。该死。
View Code
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; const int maxn=1001; struct BONE { int val; int vol; }bone[maxn]; int n,v; void init() { scanf("%d %d",&n,&v); for(int i=1;i<=n;i++) scanf("%d",&bone[i].val); for(int i=1;i<=n;i++) scanf("%d",&bone[i].vol); } int dp[maxn][maxn]; void DP() { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=0;j<=v;j++) { if(j>=bone[i].vol) dp[i][j]=max(dp[i-1][j],dp[i-1][j-bone[i].vol]+bone[i].val); else dp[i][j]=dp[i-1][j]; } } printf("%d\n",dp[n][v]); } int main() { int t; scanf("%d",&t); while(t--) { init(); DP(); } return 0; }