程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 3127 完全背包變形

hdu 3127 完全背包變形

編輯:C++入門知識

hdu 3127 完全背包變形


背景:這個題實在沒法,看的題解的思路,確實很難想到。也算明白了背包問題只是母題,其生的兒子,往往找不出來原來的母親了。

思路:

我的代碼:

#include
#include
#include
using namespace std;
int F[1009][1009],w[10][3];

int main(void){
    int t,n,x,y;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&x,&y);
        for(int i=0;i < n;i++) scanf("%d%d%d",&w[i][0],&w[i][1],&w[i][2]);
        memset(F,0,sizeof(F));
        for(int i=0;i <= x;i++)
            for(int j=0;j <= y;j++){
                for(int k=0;k < n;k++){
                    if(w[k][0] <= i && w[k][1] <= j){
                        F[i][j]=max(F[i][j],F[i-w[k][0]][j]+F[w[k][0]][j-w[k][1]]+w[k][2]);
                        F[i][j]=max(F[i][j],F[i][j-w[k][1]]+F[i-w[k][0]][w[k][1]]+w[k][2]);
                    }
                    swap(w[k][0],w[k][1]);
                    if(w[k][0] <= i && w[k][1] <= j){
                        F[i][j]=max(F[i][j],F[i-w[k][0]][j]+F[w[k][0]][j-w[k][1]]+w[k][2]);
                        F[i][j]=max(F[i][j],F[i][j-w[k][1]]+F[i-w[k][0]][w[k][1]]+w[k][2]);
                    }
                    swap(w[k][0],w[k][1]);
                }
            }
        printf("%d\n",F[x][y]);
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved