這是一道徹底揹包問題,只不過增長了限制條件。ios
在更新最大值的時候,我註釋掉了錯誤的方式,卻不明白爲何是錯誤的,若是有人看到這篇博客,而且知道爲何那樣更新是錯誤的,請指教,謝謝。spa
上代碼:code
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; #define MAXV 410 #define MAXM 40010 typedef struct{int h,a,c;}block; block s[MAXV]; int cmp(block x,block y){return x.a<y.a;} int dp[MAXM]; int use[MAXM]; int main() { int i,j,k,max,maxn=0,max1=0; while(scanf("%d",&k)!=EOF){ for(i=1;i<=k;i++) { scanf("%d %d %d",&s[i].h,&s[i].a,&s[i].c); if(maxn<s[i].a){maxn = s[i].a;} } sort(s+1,s+1+k,cmp); memset(dp,0,sizeof(dp)); dp[0] = 1; max=0; for(i=1;i<=k;i++){ memset(use,0,sizeof(use)); for(j=s[i].h;j<=s[i].a;j++){ if(dp[j-s[i].h]&& dp[j]<dp[j-s[i].h]+s[i].h&& dp[j-s[i].h]+s[i].h-1<=s[i].a&& use[j-s[i].h]<s[i].c) { dp[j] = dp[j-s[i].h]+s[i].h; use[j] = use[j-s[i].h]+1; //if(dp[j]>max){max = dp[j];}//按照這種方式更新最大值卻出現錯誤?爲什麼? } } } for(i=0;i<=maxn;i++){if(max<dp[i]){max = dp[i];}}//i最大不會超過maxn printf("%d\n",max-1); } system("pause"); return 0; }