简单背包问题+打印路径

题目地址:http://acm.fafu.edu.cn/problem.php?id=1163

简单的背包问题
Description:
设有一个背包,可以放入的重量为s。现有n件物品,重量分别为t1、t2、t3…ti … tn ,ti (1≤i≤n),均为正整数。从n件物品中挑选若干件,使得放入背包的重量之和正好为s。
Input:
输入有三行,第1行是1个整数n,表示物品的件数;第2行是n个整数,每个整数之间用空格隔开,表示每件物品的种类。第3行是1个整数s,表示背包可放入的重量。
Output:
如果无解,则输出“No Solution”。可能有多解,按解的编号字典寻列输出。对于每个解,输出包含多行,每行包含两个整数,第1个整数是所选物品的序号,第2个整数是所选物品的重量。
Sample Input:
5
1 6 2 7 5
10

Sample Output:
1 1 
3 2 
4 7

源代码如下:
#include
int n,s,i,j,weight[15],get[15]; //get数组用来标记是否选取
bool f(int n,int resV)   //下标,剩余的背包容量
{
    if(resV == 0) return 1;
    if((resV<0) || (resV>s) || (n==0)) return 0;
    get[n] = 1;
    if(f(n-1,resV-weight[n])) return 1;
    else
    {
        get[n] = 0;
        return f(n-1,resV);
    }
}
int main(void)
{
    for(i = 1; i < 15; i++)         //初始化
        get[i] = weight[i] = 0;
    scanf("%d",&n);
    for(i = 1; i <= n; i++)
        scanf("%d",&weight[i]);
    scanf("%d",&s);
    if(f(n,s))
    {
        for(i = 1; i <= n; i++)
            if(get[i]) printf("%d %d\n",i,weight[i]);
    }
    else puts("No Solution");

    return 0;
}


你可能感兴趣的:(背包系列问题)