求大佬帮助,第一次遇到DP会有些对有些错!!!

P1064 [NOIP2006 提高组] 金明的预算方案

wangjiachi @ 2018-01-11 20:09:40

什么都不说,上代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,c[110][3],w[110][3],b[101],f[101][32010],jz[101][32010],ans1,ans2,mid;
bool flag[101]={false};
int main(){
    cin>>m>>n;
    m/=10;//优化; 
    int q,ww,e,num=0;
    for(int i=1;i<=n;i++){
        cin>>q>>ww>>e;
        q=q/10;
        if(e==0){
            num++;
            w[num][0]=q;
            jz[num][0]=q*ww;
        }
        else{
            if(!flag[e]){
                w[e][1]=q;
                jz[e][1]=q*ww;
                flag[e]=true;
            }
            else{
                w[e][2]=q;
                jz[e][2]=q*ww;
            }
        }
    }
    cout<<num<<endl;
    f[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j<w[i][0])
            {
                f[i][j]=f[i-1][j];continue;
            }    
            else{
                if(j>=w[i][0])    f[i][j]=max(f[i-1][j],f[i-1][j-w[i][0]] +jz[i][0]);
                if(j>=(w[i][0]+w[i][1]))    f[i][j]=max(f[i][j],f[i-1][j-w[i][0]-w[i][1] ] +jz[i][0] +jz[i][1]);
                if(j>=(w[i][0]+w[i][2]))    f[i][j]=max(f[i][j],f[i-1][j-w[i][0]-w[i][2] ] +jz[i][0] +jz[i][2]);
                if(j>=(w[i][0]+w[i][1]+w[i][2]))    f[i][j]=max(f[i][j],f[i-1][j-w[i][0]-w[i][1]-w[i][2] ] +jz[i][0] +jz[i][1] +jz[i][2]);
            }
        }
    }
    cout<<f[n][m]*10;
    return 0;
}

先谢谢给位大佬 Hail HYDRA


by Loner_Knowledge @ 2018-01-12 00:45:16

@wangjiachi 那个f[0][0]=1和除十的意义何在?前一个貌似就是多余的(有可能就是错在这了),后一个由于空间足够所以可有可无。


by wangjiachi @ 2018-01-14 14:06:05

@Loner_Knowledge 先谢谢大佬!!!不过这样也不对,只多了10分,就很尴尬,不过谢谢啦!!!!


by Loner_Knowledge @ 2018-01-14 17:05:06

@wangjiachi 找到错误了,num的锅,删去即可,读入时不能离散化,遍历到几就得存在w[几]和jz[几],否则可能附件和主件对不上。


by Loner_Knowledge @ 2018-01-14 20:32:35

@Loner_Knowledge 可以看看这个帖子。


by Loner_Knowledge @ 2018-01-15 19:23:29

@wangjiachi @错了,可以看看这个帖子。


by wangjiachi @ 2018-01-16 18:33:21

@Loner_Knowledge 先谢谢!!!!我第一次是用N的,但后来不对,看那个帖子也不是很懂,可不可以再解释下,好像不是主件在附件之前输入的问题


by Loner_Knowledge @ 2018-01-16 19:49:32

@wangjiachi 不是那里的锅,是这几行的锅:

f[i][j]=max(f[i-1][j],f[i-1][j-w[i][0]] +jz[i][0]);
if(j>=(w[i][0]+w[i][1]))    f[i][j]=max(f[i-1][j],f[i-1][j-w[i][0]-w[i][1] ] +jz[i][0] +jz[i][1]);
if(j>=(w[i][0]+w[i][2]))    f[i][j]=max(f[i-1][j],f[i-1][j-w[i][0]-w[i][2] ] +jz[i][0] +jz[i][2]);
if(j>=(w[i][0]+w[i][1]+w[i][2]))    f[i][j]=max(f[i-1][j],f[i-1][j-w[i][0]-w[i][1]-w[i][2] ] +jz[i][0] +jz[i][1] +jz[i][2]);

后三行应该是与f[i][j]比较最大值,因为在此时f[i-1][j]不一定等于f[i][j]。

另外关于你的疑问是这样的,主件的编号并不是连续的,像1,2,3,4,5,6这样,而是有可能这样1,2,5,7,8,9这样存储。


by wangjiachi @ 2018-01-16 20:07:47

@Loner_Knowledge 谢谢!!!!!这样就过了!!!其实我自己想的是f[i][j],然后我们老师让我改成f[i-1][j];就很尴尬【手动苦笑】;谢谢!!!!!


by wangjiachi @ 2018-01-16 20:09:11

@Loner_Knowledge 加个qq呗 1223761954


|