揹包01和完全

完全揹包:

尋找for(i=0.......m)此容量下的最優解;

或者用一種東西將揹包每個容量裝滿,再找下一個東西在此基礎上裝的最優解;

#include<bits/stdc++.h>
using namespace std;
const int maxn=555;
int dp[111111];
int need[maxn],value[maxn];
int n,m;
int main()
{
    int i,j,k;
    while(~scanf("%d %d",&n,&m))
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            scanf("%d %d",&need[i],&value[i]);
        for(i=1;i<=n;i++)
        {
            cout<<i<<endl;
            for(j=need[i];j<=m;j++)
            {
                if(j>=need[i])
                  dp[j]=max(dp[j],dp[j-need[i]]+value[i]);
                  cout<<dp[j]<<"_______"<<j<<endl;
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}

或者

#include<bits/stdc++.h>
using namespace std;
const int maxn=555;
int dp[111111];
int need[maxn],value[maxn];
int n,m;
int main()
{
    int i,j,k;
    while(~scanf("%d %d",&n,&m))
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            scanf("%d %d",&need[i],&value[i]);
        for(j=1;j<=m;j++)
        {
            cout<<j<<endl;
            for(i=1;i<=n;i++)
            {
                if(j>=need[i])
                  dp[j]=max(dp[j],dp[j-need[i]]+value[i]);
                  cout<<dp[j]<<"_______"<<i<<endl;
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}

01揹包:

for( i=1..N )
for (v=V..0 )、、這樣保證計算f[v]相當於f[i][v]     第二個f[v]相當於f[i-1][v];     f[v-c[i]]相當於f[i-1][v-c[i]];

f[v]=max{f[v],f[v-c[i]]+w[i]}; 

若循環由0到v則必須用二維數組計算;思路相同


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章