【DP】HDU 3127 WHUgirls 完全背包
dp[i][j] i表示长 j表示宽
注意循环顺序
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 2111;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 11521204; const int mod=1000000007; int dp[MAXN][MAXN]; int a[MAXN],b[MAXN],c[MAXN]; int main() { int t,n,x,y; // IN; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&n,&x,&y); for(int i=0; i<n; i++) scanf("%d%d%d",&a[i],&b[i],&c[i]); for(int i=x; i>=0; i--) { for(int j=y; j>=0; j--) { for(int k=0; k<n; k++) { if(j+b[k]<=y) dp[i][j]=max(dp[i][j],dp[i][j+b[k]]+i/a[k]*c[k]); if(i+b[k]<=x) dp[i][j]=max(dp[i][j],dp[i+b[k]][j]+j/a[k]*c[k]); if(j+a[k]<=y) dp[i][j]=max(dp[i][j],dp[i][j+a[k]]+i/b[k]*c[k]); if(i+a[k]<=x) dp[i][j]=max(dp[i][j],dp[i+a[k]][j]+j/b[k]*c[k]); } } } printf("%d\n",dp[0][0]); } return 0; } /* 10 2 5 5 2 2 3 2 3 4 15 */