問題の説明
。私は、家具の一部で、私の宮殿の家に行くよ「私は私のために買い物をするための計画を策定することができなければなりません。主なポイントの家具のオプション、家具やアクセサリーのn個の種類があります。主な取付部材の購入に先立ち、私はあなたは、家具の主要対応した各部分は、独自の価格x iは、yの重要性を持っているとして、附属書の対応する主な作品は、家具の他の作品の主要部分ではありません購入する必要があります。これを実現するために、必要に私は怠慢「CJK。それは、製品の価格と最高の1と重要性でm個の要素よりもかかりません場合には家具が取得することができません描く、すぐにコードのコードを開始します。
入力形式
最初の2つの数のライン、mおよびnは、nは次の行は、3つの数字のX、Y、Z、それぞれ、商品番号の価格、及び本体(Z 0の重要性の程度のi番目の行はことを示していますアイテムを中心個)。
出力フォーマット
家具の購入価格のすべての製品や重要度など。(XIのような形李+ XJ YJ + ......、I、J家具IDの購入のために)
サンプル入力と出力
サンプル入力1
5 1000
800 2 0
400 10 1
300 10 1
400 3 0
500 2 0
サンプル出力1
2200
サンプル入力2
5 1000
800 2 0
400 10 1
300 10 1
400 3 1
500 2 1
サンプル出力2
1600
解決
あなたは完全に裸のナップザック問題である主要な添付ファイルを、考慮していない場合。しかし、選挙は、アクセサリーの主要な部分を選択する必要がありますので、我々は、依存関係に対処する方法を検討している場合。私たちは、現在のグループの結果の一部は、主要作品の主要部分の後に付属品01バックパックを実行した後、選択したグループで設定することができます。各DPの前に、スコアにコピーグループの前にスコアセットのメインアレイの結果を考えると、メインアレイを更新するために、バックパックを終えます。あなたは01バックパックに実行すると、電流による主要部品、注意を払うように過ごすの範囲に選択されていることに注意してください。
コード
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<int> v[62];
int n,m,i,j,k,w[62],c[62],op[62],f[30002],g[30002];
int main()
{
freopen("budget.in","r",stdin);
freopen("budget.out","w",stdout);
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>w[i]>>c[i]>>op[i];
c[i]*=w[i];
if(op[i]) v[op[i]].push_back(i);
}
for(i=1;i<=n;i++){
if(!op[i]){
for(j=w[i];j<=m;j++) g[j]=f[j-w[i]]+c[i];
for(j=0;j<v[i].size();j++){
int x=v[i][j];
for(k=m;k>=w[i]+w[x];k--) g[k]=max(g[k],g[k-w[x]]+c[x]);//在这里注意范围
}
for(j=1;j<=m;j++) f[j]=max(f[j],g[j]);
memset(g,0,sizeof(g));
}
}
cout<<f[m]<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
概要
十分に詳しくない、全く別のDP制約と状態が制約失敗をリードし、存在しないので、私は期待したりしたくありませんでした。