QDUOJ 分辣条-01背包恰好装满情况

分辣条

发布时间: 2016年6月26日 20:36   最后更新: 2016年6月26日 20:37   时间限制: 1000ms   内存限制: 128M

“你喝的酸奶是我买的,辣条也是我买的,你现在要跟我分手,你把我当什么?”

“因为你每次分辣条的时候都比我多一根!”

可见分好辣条是一件多么重要的事情。。

现在有n(1<=n<=200)根辣条,每根辣条的重量为a1,a2...ai..an(1<=ai<=100)。

那么能不能把这些辣条分为重量相等的两份呢?

输入有多组数据。
每组数据第一行为一个整数n(1<=n<=200),n代表辣条的数量。
第二行有n个整数,a1,a2...ai..an,其中ai(1<=ai<=100)代表第i根辣条的重量

若能分成重量相等的两份,则输出"YES",否则输出"NO"每个答案占一行

 复制
3
1 2 1
4
1 1 1 2
YES
NO

01背包解决恰好装满情况,利用容积与价值相等。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,sum,i,j;
    int a[205],f[20005];
    while(~scanf("%d",&n)){
        sum=0;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum%2==1) printf("NO\n");
        else{
            sum/=2;
            memset(f,0,sizeof(f));
            for(i=1;i<=n;i++){
                for(j=sum;j>=0;j--){
                    if(j-a[i]>=0){
                        if(f[j-a[i]]+a[i]>f[j]) f[j]=f[j-a[i]]+a[i];
                    }
                }
            }
            if(f[sum]==sum) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}  

 

 

分辣条2

 

Description

 

啊啊有根很大的辣条,重量为n,啊啊想把辣条分给很多小朋友,但是必须满足下列条件:

1.每个小朋友分得的辣条重量为a,b或c;

2.分得辣条的小朋友的数量最多;

3.没有剩余的辣条,也就是说所有辣条都分完啦。

帮帮啊啊找出能分得辣条小朋友的数量。

 

Input

有多组数据,每组数据包含4个整数n,a,b,c(1<=n,a,b,c<=4000)

Output

每组数据输出能分得辣条的小朋友数量,每组输出占一行

Sample Input 1 

5 5 3 2

Sample Output 1

2

Sample Input 2 

7 5 5 2

Sample Output 2

2

Source

2015级计科纳新考试

 

 

#include<bits/stdc++.h>
#define MAX 5005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int a[5];
int dp[MAX];

int main()
{
    int n,i,j;
    while(~scanf("%d",&n)){
        for(i=1;i<=3;i++){
            scanf("%d",&a[i]);
        }
        memset(dp,-INF,sizeof(dp));
        dp[0]=0;
        for(i=1;i<=3;i++){
            for(j=a[i];j<=n;j++){
                dp[j]=max(dp[j],dp[j-a[i]]+1);
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}

 

posted @ 2017-07-19 00:24  yzm10  阅读(375)  评论(0编辑  收藏  举报