[01] [リュック] Cダイナミックプログラミングの問題:ハーブの問題解決

[01]ナップザック問題C:ハーブの
制限時間:1秒メモリ制限:128 MBの
対象の説明
陳は才能のある子だった、彼の夢は、世界で最も偉大な医師になることです。この目的のために、彼は教師として最も権威のある医師の近くに崇拝したかったです。医師は、彼の資格を決定するために、彼に問題を与えました。医師は彼に言うハーブの完全な洞窟に連れて行った:.「子供たちは、この洞窟は、いくつかの異なるハーブを持って、それぞれの植物を選ぶことはある程度の時間が必要で、各工場は独自の価値を持っていると私は与えるだろうあなたがスマートな子供であれば、あなたはいくつかの時間、この時間の間に、あなたはハーブの合計値を作るために注意する必要があり、いくつかのハーブの最大値を選ぶことができます。「
あなたは陳をしている場合は、このタスクを達成することができますそれは?

入力
入力の最初の2行目の整数T(1 <= T <= 1000) とM(1 <= M <= 100)、 スペースで区切られ、そしてTが表す合計時間を使用することができるハーブ、Mハーブ洞窟の代表者の数。次のMラインはそれぞれ(1及び100を含む)100と1との間の2つの整数を含む、それぞれ、ハーブ時間にこの歪み及びハーブを選んだ歪みの値を表します。

出力の
出力は、単一の整数を含む行を含み、時間の特定の期間においては、ハーブの最大合計値を取ることができると述べました。

サンプル入力コピー
70 3
71 100
69 1
1 2。
サンプル出力コピー
3。
ACコード:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

int main()
{
    int n,m,B[1000],v[1000],w[1000];
    int i,j;
    memset(B,0,sizeof(B));/*清零*/
    B[0]=0;
    scanf("%d %d",&n,&m);   /*n为容量,m为物品数*/
    for(i=0; i<m; i++)
    {
        scanf("%d %d",&w[i],&v[i]);
    }
    for(i=0; i<m; i++)
    {
        for(j=n; j>=0; j--)
        {
            if(B[j]<=B[j-w[i]]+v[i] && j-w[i]>=0 )/*更新状态*/
            {
                B[j]=B[j-w[i]]+v[i];
            }

        }
    }
//    for(i=0;i<=n;i++)
//    {
//        printf("%d ",B[i]);            /*测试数据(插桩)*/
//    }
    printf("%d",B[n]);            /*数组第n个值为最优解*/

    return 0;

}


このコードは、最適解が最適な組成物から得ることができず、最適なソリューションのすべてを表示することができない由来することができるいくつかの項目、後続の更新。

リリース元の2件の記事 ウォンの賞賛0 ビュー168

おすすめ

転載: blog.csdn.net/weixin_45800034/article/details/104060990